Skip to content

Get Number In String Dynamo

🕒 Published at:

Mở đầu

Trong quá trình làm việc ta thường làm việc với các chuỗi số stringnumber lẫn lộn, đôi khi xảy ra sai sót trong quá trình lọc và tính toán.Với hai node này sẽ giúp bạn cảm thấy thoải mái hơn cho công việc tách biệt giữa số và chữ tồn tại trong danh sách hoặc một chuỗi.

Vấn đề sẽ được xử lý tách biệt ở hai node:

1.Gộp chuỗi số thành đoạn số

2.Tách biệt các chuỗi số bởi dấu cách

Cách xử lý

cs
   /// <summary>
        /// Return Number Join In String Example : (hello 23 my 28) return [2328]
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        
         public static IEnumerable<string> NumberInString(string str)
        {
            string b = string.Empty;
            string[] spearator = {"."};
            List<double> result = new List<double>();
            for (int i=0; i< str.Length; i++)
            {
                if (char.IsDigit(str[i]))
                    b += str[i];
            }

            if (b.Length > 0)
            {
                if (int.TryParse(b,out int int32))
                {
                    result.Add(int32);
                }
                else if (double.TryParse(b,out double val))
                {
                    result.Add(val);
                }
            }
            return result.Select(x => x.ToString(CultureInfo.InvariantCulture));
        }

Hoac :

cs
  /// <summary>
        /// Return Number split In String : Example : (hello 23 my 28) return [23,28]
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        
        public static IEnumerable<string> NumberInStrings (string str)
        {
            var nums = new List<double>();
            var start = -1;
            for (int i = 0; i < str.Length; i++)
            {
                if (start < 0 && char.IsDigit(str[i]))
                {
                    start = i;
                }
                else if (start >= 0 && !char.IsDigit(str[i]))
                {
                    nums.Add(double.Parse(str.Substring(start, i - start)));
                    start = -1;
                }
            }
            if (start >= 0)
                nums.Add(double.Parse(str.Substring(start, str.Length - start)));
            return nums.Select(x=>x.ToString(CultureInfo.InvariantCulture));
        }

Đối với người dùng python, có thể mở rộng thông qua mã ví dụ đơn giản sau :

py
from itertools import groupby
my_str = "hello 12 hi 89"

l = [int(''.join(i)) for is_digit, i in groupby(my_str, str.isdigit) if is_digit]
print(l)
#output =[12,89]

Kết quả

Tải về Package DynaMEP

Ví dụ chung :

Ví dụ cho việc lấy số Level :

Ví dụ cho lấy về Element trong danh sách từ Excel :

Một trường hợp ngoại lệ bỏ kí tự 0 phía sau các số khi bạn muốn lấy số ra để sử dụng, đến nay vẫn nhiều vấn đề tranh luận xung quanh vấn đề này, có thể giải quyết luôn :

Mở rộng

Đối với trường hợp ngược lại làm thế nào để sử dụng các chuỗi bên trong bao gồm số.Mình sẽ giới thiệu cách đơn giản nhất:

py
output = []
for x in IN[0]:
	output.append(filter(lambda v: not str.isdigit(v), x))
OUT = output

Tải về : NumberInString.dyn

Tham khảo

Dynamo Forum