Переглянути джерело

feature: 增加字符串判断包含中文的方式

xf 6 місяців тому
батько
коміт
42b2df68f9

+ 1 - 1
src/Hotline.Application.Contracts/Validators/Order/AddOrderDtoValidator.cs

@@ -12,7 +12,7 @@ public class AddOrderDtoValidator : AbstractValidator<AddOrderDto>
 
         #region 医疗服务中心受理单
 
-        RuleFor(d => d.OrderExtension.MedName).MaximumLength(200).When(d=>d.OrderExtension!=null).WithMessage("医院名称最多200字符");
+        RuleFor(d => d.OrderExtension.MedName).MaxLengthWithChineseChar(200).When(d=>d.OrderExtension!=null).WithMessage("医院名称最多200字符");
         RuleFor(d => d.OrderExtension.MedAddress).MaximumLength(500).When(d=>d.OrderExtension!=null).WithMessage("医院地址最多500字符");
         RuleFor(d => d.OrderExtension.MedDepartment).MaximumLength(100).When(d=>d.OrderExtension!=null).WithMessage("科室最多200字符");
         RuleFor(d => d.OrderExtension.MedDoctor).MaximumLength(50).When(d=>d.OrderExtension!=null).WithMessage("医生最多200字符");

+ 3 - 0
src/Hotline.Application.Contracts/Validators/ValidatorExtensions.cs

@@ -10,4 +10,7 @@ public static class ValidatorExtensions
     /// </summary>
     public static IRuleBuilderOptions<TDto, string> IsGuidStructureString<TDto>(this IRuleBuilderInitial<TDto, string> initial) =>
         initial.Cascade(CascadeMode.Stop).NotEmpty().Must(d => d.IsGuidString());
+    
+    public static IRuleBuilderOptions<TDto, string> MaxLengthWithChineseChar<TDto>(this IRuleBuilderInitial<TDto, string> initial, int maxLength) =>
+        initial.Cascade(CascadeMode.Stop).Must(d => d.GetChineseCharLength() < maxLength);
 }

+ 21 - 0
src/XF.Domain/Extensions/StringExtensions.cs

@@ -54,5 +54,26 @@ namespace XF.Domain.Extensions
             }
             return sb.ToString();
         }
+        
+        public static int GetChineseCharLength(this string str)
+        {
+            if (str.Length == 0)
+                return 0;
+            ASCIIEncoding ascii = new ASCIIEncoding();
+            int tempLen = 0; 
+            byte[] s = ascii.GetBytes(str);
+            for (int i = 0; i < s.Length; i++)
+            {
+                if ((int)s[i] == 63)
+                {
+                    tempLen += 2;
+                }
+                else
+                {
+                    tempLen += 1;
+                }
+            }
+            return tempLen;
+        }
     }
 }