@@ -202,9 +202,15 @@ public virtual Int32 ToInt(Object? value, Int32 defaultValue)
202
202
if ( value is String str )
203
203
{
204
204
// 拷贝而来的逗号分隔整数
205
- str = str . Replace ( "," , null ) ;
206
- str = ToDBC ( str ) . Trim ( ) ;
207
- return str . IsNullOrEmpty ( ) ? defaultValue : Int32 . TryParse ( str , out var n ) ? n : defaultValue ;
205
+ Span < Char > tmp = stackalloc Char [ str . Length ] ;
206
+ var rs = TrimNumber ( str . AsSpan ( ) , tmp ) ;
207
+ if ( rs == 0 ) return defaultValue ;
208
+
209
+ #if NETCOREAPP || NETSTANDARD2_1_OR_GREATER
210
+ return Int32 . TryParse ( tmp [ ..rs ] , out var n ) ? n : defaultValue ;
211
+ #else
212
+ return Int32 . TryParse ( new String ( tmp [ ..rs ] . ToArray ( ) ) , out var n ) ? n : defaultValue ;
213
+ #endif
208
214
}
209
215
210
216
// 特殊处理时间,转Unix秒
@@ -278,9 +284,15 @@ public virtual Int64 ToLong(Object? value, Int64 defaultValue)
278
284
if ( value is String str )
279
285
{
280
286
// 拷贝而来的逗号分隔整数
281
- str = str . Replace ( "," , null ) ;
282
- str = ToDBC ( str ) . Trim ( ) ;
283
- return str . IsNullOrEmpty ( ) ? defaultValue : Int64 . TryParse ( str , out var n ) ? n : defaultValue ;
287
+ Span < Char > tmp = stackalloc Char [ str . Length ] ;
288
+ var rs = TrimNumber ( str . AsSpan ( ) , tmp ) ;
289
+ if ( rs == 0 ) return defaultValue ;
290
+
291
+ #if NETCOREAPP || NETSTANDARD2_1_OR_GREATER
292
+ return Int64 . TryParse ( tmp [ ..rs ] , out var n ) ? n : defaultValue ;
293
+ #else
294
+ return Int64 . TryParse ( new String ( tmp [ ..rs ] . ToArray ( ) ) , out var n ) ? n : defaultValue ;
295
+ #endif
284
296
}
285
297
286
298
// 特殊处理时间,转Unix毫秒
@@ -349,8 +361,15 @@ public virtual Double ToDouble(Object? value, Double defaultValue)
349
361
// 特殊处理字符串,也是最常见的
350
362
if ( value is String str )
351
363
{
352
- str = ToDBC ( str ) . Trim ( ) ;
353
- return str . IsNullOrEmpty ( ) ? defaultValue : Double . TryParse ( str , out var n ) ? n : defaultValue ;
364
+ Span < Char > tmp = stackalloc Char [ str . Length ] ;
365
+ var rs = TrimNumber ( str . AsSpan ( ) , tmp ) ;
366
+ if ( rs == 0 ) return defaultValue ;
367
+
368
+ #if NETCOREAPP || NETSTANDARD2_1_OR_GREATER
369
+ return Double . TryParse ( tmp [ ..rs ] , out var n ) ? n : defaultValue ;
370
+ #else
371
+ return Double . TryParse ( new String ( tmp [ ..rs ] . ToArray ( ) ) , out var n ) ? n : defaultValue ;
372
+ #endif
354
373
}
355
374
356
375
if ( value is Byte [ ] buf && buf . Length <= 8 )
@@ -383,8 +402,15 @@ public virtual Decimal ToDecimal(Object? value, Decimal defaultValue)
383
402
// 特殊处理字符串,也是最常见的
384
403
if ( value is String str )
385
404
{
386
- str = ToDBC ( str ) . Trim ( ) ;
387
- return str . IsNullOrEmpty ( ) ? defaultValue : Decimal . TryParse ( str , out var n ) ? n : defaultValue ;
405
+ Span < Char > tmp = stackalloc Char [ str . Length ] ;
406
+ var rs = TrimNumber ( str . AsSpan ( ) , tmp ) ;
407
+ if ( rs == 0 ) return defaultValue ;
408
+
409
+ #if NETCOREAPP || NETSTANDARD2_1_OR_GREATER
410
+ return Decimal . TryParse ( tmp [ ..rs ] , out var n ) ? n : defaultValue ;
411
+ #else
412
+ return Decimal . TryParse ( new String ( tmp [ ..rs ] . ToArray ( ) ) , out var n ) ? n : defaultValue ;
413
+ #endif
388
414
}
389
415
390
416
if ( value is Byte [ ] buf )
@@ -450,7 +476,6 @@ public virtual Boolean ToBoolean(Object? value, Boolean defaultValue)
450
476
// 特殊处理字符串,也是最常见的
451
477
if ( value is String str )
452
478
{
453
- //str = ToDBC(str).Trim();
454
479
str = str . Trim ( ) ;
455
480
if ( str . IsNullOrEmpty ( ) ) return defaultValue ;
456
481
@@ -459,8 +484,6 @@ public virtual Boolean ToBoolean(Object? value, Boolean defaultValue)
459
484
if ( String . Equals ( str , Boolean . TrueString , StringComparison . OrdinalIgnoreCase ) ) return true ;
460
485
if ( String . Equals ( str , Boolean . FalseString , StringComparison . OrdinalIgnoreCase ) ) return false ;
461
486
462
- // 特殊处理用数字0和1表示布尔型
463
- str = ToDBC ( str ) ;
464
487
return Int32 . TryParse ( str , out var n ) ? n > 0 : defaultValue ;
465
488
}
466
489
@@ -604,22 +627,32 @@ public virtual DateTimeOffset ToDateTimeOffset(Object? value, DateTimeOffset def
604
627
}
605
628
}
606
629
607
- /// <summary>全角为半角 </summary>
608
- /// <remarks>全角半角的关系是相差0xFEE0</remarks >
609
- /// <param name="str "></param>
630
+ /// <summary>清理整数字符串,去掉常见分隔符,替换全角数字为半角数字 </summary>
631
+ /// <param name="input"></param >
632
+ /// <param name="output "></param>
610
633
/// <returns></returns>
611
- private static String ToDBC ( String str )
634
+ private static Int32 TrimNumber ( ReadOnlySpan < Char > input , Span < Char > output )
612
635
{
613
- var ch = str . ToCharArray ( ) ;
614
- for ( var i = 0 ; i < ch . Length ; i ++ )
636
+ var rs = 0 ;
637
+ for ( var i = 0 ; i < input . Length ; i ++ )
615
638
{
639
+ // 去掉逗号分隔符
640
+ var ch = input [ i ] ;
641
+ if ( ch == ',' || ch == '_' || ch == ' ' ) continue ;
642
+
616
643
// 全角空格
617
- if ( ch [ i ] == 0x3000 )
618
- ch [ i ] = ( Char ) 0x20 ;
619
- else if ( ch [ i ] is > ( Char ) 0xFF00 and < ( Char ) 0xFF5F )
620
- ch [ i ] = ( Char ) ( ch [ i ] - 0xFEE0 ) ;
644
+ if ( ch == 0x3000 )
645
+ ch = ( Char ) 0x20 ;
646
+ else if ( ch is > ( Char ) 0xFF00 and < ( Char ) 0xFF5F )
647
+ ch = ( Char ) ( input [ i ] - 0xFEE0 ) ;
648
+
649
+ // 数字和小数点 以外字符,认为非数字
650
+ if ( ch is not '.' and ( < '0' or > '9' ) ) return 0 ;
651
+
652
+ output [ rs ++ ] = ch ;
621
653
}
622
- return new String ( ch ) ;
654
+
655
+ return rs ;
623
656
}
624
657
625
658
/// <summary>去掉时间日期秒后面部分,可指定毫秒ms、秒s、分m、小时h</summary>
0 commit comments