2016-12-16 52 views
1

我想基于NSLocale将输入为NSString的数字转换为NSDecimalNumber基于区域将NSSting转换为NSDecimalNumber

例如

InputString => 110.50 
Current Locale => en_FI 
Expected output => 110.50 
Actual output => 110 

InputString => 110.50 
Current Locale => en_US 
Expected output => 110.50 
Actual output => 110.50 



InputString => 110,50 
Current Locale => en_US 
Expected output => 110.50 
Actual output => 110 


InputString => 110.50 
Current Locale => en_US 
Expected output => 110.50 
Actual output => 110.50 

我使用下面的代码来实现这一点,但它不工作。

NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithString:self.amountTextField.text locale:[NSLocale currentLocale]]; 

如上所述在第一和第三我不是所需的输出。任何想法我在这里做错了。

+0

如果你忽略了区域特性,为什么你要使用localre? – Sulthan

+0

你是谷歌这个问题的标题? – danh

回答

0

我建议你指定NumberFormatter小号decimalSeparator自己和输入字符串替换,.与您decimalSeparator使用相同的字符。

import Foundation 

let formatter = NumberFormatter() 
formatter.numberStyle = .decimal 

func cleanNumberString(with string: String) -> String { 
    let knownDecimalSeparators = [",", "."] 
    let localSeparator = formatter.decimalSeparator ?? "." 
    var cleanString = string; 
    for separator in knownDecimalSeparators { 
     cleanString = cleanString.replacingOccurrences(of: separator, with: localSeparator) 
    } 
    return cleanString 
} 

func number(with string: String) -> Double { 
    let cleanString = cleanNumberString(with: string) 
    let number = formatter.number(from: cleanString) 
    return number?.doubleValue ?? 0 
} 

let string1 = "14,4" 
let string2 = "14.4" 

let cleanString1 = cleanNumberString(with: string1) 
let cleanString2 = cleanNumberString(with: string2) 

let number1 = number(with: string1) 
let number2 = number(with: string2) 

在Objective-C

@interface CleanNumberFormatter() 

@property (nonatomic) NSNumberFormatter *formatter; 

@end 

@implementation CleanNumberFormatter 

- (instancetype)init 
{ 
    self = [super init]; 
    if (self) { 
     self.formatter = [NSNumberFormatter new]; 
     self.formatter.numberStyle = NSNumberFormatterDecimalStyle; 
    } 
    return self; 
} 

- (NSString *)cleanNumberStringWithString:(NSString *)string 
{ 
    NSArray *knownDecimalSeparators = @[@",", @"."]; 
    NSString *localSeparator = self.formatter.decimalSeparator ?: @","; 
    NSString *cleanString = [string copy]; 
    for (NSString *separator in knownDecimalSeparators) { 
     cleanString = [cleanString stringByReplacingOccurrencesOfString:separator withString:localSeparator]; 
    } 
    return cleanString; 
} 

- (double)numberWithString:(NSString *)string 
{ 
    NSString *cleanString = [self cleanNumberStringWithString:string]; 
    double number = [self.formatter numberFromString:cleanString].doubleValue; 
    return number; 
} 

- (void)foo 
{ 
    NSString *string1 = @"14.4"; 
    NSString *string2 = @"14,4"; 

    NSString *cleanString1 = [self cleanNumberStringWithString:string1]; 
    NSString *cleanString2 = [self cleanNumberStringWithString:string2]; 

    double number1 = [self numberWithString:string1]; 
    double number2 = [self numberWithString:string2]; 
} 

@end 
+0

我不想硬编码小数点分隔符,我想从设备区域设置得到它 – Madu

+0

@ en_FI的马德小数分隔符是',',但是在你的输入字符串中它是'.'。所以在你的例子中,一切都按预期工作。 –

+0

是的,这就是我想要的,如果设备区域设置是en_FI和用户输入110.25。那么它正确地改变给我110.25而不是110只 – Madu

0

没有预期的输出唯一的数字相同的一个逗号,而不是一个句号和一个周期,而不是在输入一个逗号。尝试替换它,看看它是否工作,因为一些当地人使用不同的小数点分隔符。

+0

这就是要达到的目的,即如果用户设备区域设置为美国,并且他以某种欧盟国家/地区格式输入数字,则应将该数字更改为设备区域设置格式。 – Madu

+0

对不起,我不明白你的问题。你可能想看看你的字符串,并根据语言环境更换分隔符?因为区域设置本身会忽略您的小数点,如果分隔符不是正确的。在转换为数字之前添加自己的方法来完成此操作可能是最佳选择。 –