原代碼
Class cls = NSClassFromString(className); if ([cls isSubclassOfClass:[NSNumber class]]) { NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; returnObject = [numberFormatter numberFromString:obj]; }
此時(shí)的NSNumber對(duì)應(yīng)的值是整數(shù) ,1234、10、23、1 等都解析正常
但是如果此時(shí) NSNumber 對(duì)應(yīng)的值是小數(shù),例如經(jīng)緯度 12.111111 、31.222222、1.203 等, 他會(huì)解析失敗
原因, 系統(tǒng)通用設(shè)置,語(yǔ)言和地區(qū) 把中國(guó)大陸或者中國(guó)香港改成了 非中國(guó)地區(qū), 導(dǎo)致NSNumber 解析失敗
解決方法1. 改成中國(guó)大陸或香港
解決辦法2 代碼修改
if ([cls isSubclassOfClass:[NSNumber class]]) { // NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; // returnObject = [numberFormatter numberFromString:obj]; /** NSNumberFormatter默認(rèn)配置可能不適合所有數(shù)字格式(例如,它可能期望特定的小數(shù)點(diǎn)分隔符或區(qū)域設(shè)置)。 配置 NSNumberFormatter(如設(shè)置 locale 或 decimalSeparator)會(huì)增加復(fù)雜性,而 [NSString doubleValue] 更直接且足以處理你的用例。 */ // 改進(jìn) NSNumber 的處理邏輯 if ([obj isKindOfClass:[NSString class]]) { // 將字符串轉(zhuǎn)換為 float,然后包裝為 NSNumber float floatValue = [obj floatValue]; returnObject = @(floatValue); // 或 [NSNumber numberWithDouble:doubleValue] } else if ([obj isKindOfClass:[NSNumber class]]) { returnObject = obj; // 如果已經(jīng)是 NSNumber,直接使用 } else { NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; returnObject = [numberFormatter numberFromString:obj]; } }
浙公網(wǎng)安備 33010602011771號(hào)