根据区域设置

时间:2016-12-16 14:04:25

标签: ios objective-c nsstring nslocale nsdecimalnumber

我想根据NSLocale将输入为NSString的数字转换为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]];

如上所述,在第1和第3中,我不是所需的输出。知道我在这里做错了什么。

2 个答案:

答案 0 :(得分:0)

我建议您自己指定NumberFormatter s 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

答案 1 :(得分:0)

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

相关问题