根据语言环境将 NSSting 转换为 NSDecimalNumber

Posted

技术标签:

【中文标题】根据语言环境将 NSSting 转换为 NSDecimalNumber【英文标题】:Convert NSSting to NSDecimalNumber based on locale 【发布时间】:2016-12-16 14:04:24 【问题描述】:

我想根据 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 中,我不是所需的输出。知道我在这里做错了什么。

【问题讨论】:

如果您忽略了区域设置细节,为什么还要使用 localre? 你用谷歌搜索过这个问题的标题吗? 【参考方案1】:

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

【讨论】:

这就是想要实现的目标,如果用户设备区域设置是美国并且他以某种欧盟国家/地区格式输入数字,那么它应该将该数字更改为设备区域设置格式。 抱歉,我没有正确理解您的问题。您可能想查看您的字符串并根据语言环境替换分隔符?因为如果分隔符不正确,语言环境本身将忽略您的小数。在转换为数字之前添加您自己的方法可能是最好的选择。【参考方案2】:

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

【讨论】:

我不想硬编码小数点分隔符,我想从设备语言环境中获取它 en_FI 的@Madu 小数分隔符是 ,,但在您的输入字符串中是 .。因此,在您的示例中,一切都按预期工作。 是的,如果设备区域设置为 en_FI 并且用户输入 110.25,这就是我想要的。然后它正确地改变给我 110.25 而不是 110 而已 @Madu 我的示例代码为您提供了您想要的。您想为当前语言环境正确格式化字符串吗? @Madu 我已经更正了答案。 cleanNumberString(with) 返回当前区域设置正确的数字字符串,number(with) 返回双精度。

以上是关于根据语言环境将 NSSting 转换为 NSDecimalNumber的主要内容,如果未能解决你的问题,请参考以下文章

XDocReport 将 odt 转换为 pdf 如何设置正确的语言环境

将 NSString 转换为特定于语言环境的 NSNumber

如何编译 Informix GLS 语言环境/字符集。 (将 .lc 文件转换为 .lco 以创建数据库的 Informix 语言环境)

怎样能将汇编语言转换成c语言

JavaScript 字符串转换大写

将特定于语言环境的字符串转换为 BigDecimal 的最佳方法