首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS NSString 轉 Int 異常排查:非數字字符導致 intValue 返回 0,stringByTrimmingCharactersInSet 修正

     編輯:程式設計綜合問答

現象:`NSString *str = [NSString stringWithFormat:@"%@", value]; int v = [str intValue];` 期望 2 實得 0。

根因:字符串包含非數字字符(空格、換行、隱形字符、單位等)

intValue 解析規則:**從左向右讀取數字,遇首個非數字字符停止**。若首字符非數字,直接返回 0。

修正方案:去除非數字字符後再轉換

NSString *cleanStr = [str stringByTrimmingCharactersInSet:
    [[NSCharacterSet decimalDigitCharacterSet] invertedSet]];
int value = [cleanStr intValue];

原理:`decimalDigitCharacterSet` 包含 0-9,`invertedSet` 取反得到**非數字字符集**,`trimmingCharactersInSet` 移除首尾非數字字符。

更嚴格:提取首個連續數字子串

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\d+" options:0 error:nil];
NSTextCheckingResult *match = [regex firstMatchInString:str options:0 range:NSMakeRange(0, str.length)];
if (match) {
    NSString *numStr = [str substringWithRange:match.range];
    int value = [numStr intValue];
}

調試技巧

NSLog(@"Raw string: '%@' length=%lu", str, (unsigned long)str.length);
// 逐字符檢查
for (int i=0; i

總結

  • 數據源不可信時,**必須清洗後再轉換**。
  • 優先用 `trimmingCharactersInSet` 簡單場景,正則提取複雜場景。
  • Swift 中用 `Int(str.filter(\.isWholeNumber))` 或 `Scanner` 更安全。

理解 `intValue` 解析停止規則,徹底解決「明明有數字卻轉 0」疑難雜症。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved