将字符串转换为NSDecimalNumber

时间:2015-11-13 20:38:23

标签: ios string swift nsdecimalnumber

我尝试将String转换为NSDecimalNumber,这是我的代码:

class func stringToDecimal (dataToDecimal: String) -> NSDecimalNumber {

    let dataToDecimal = dataToDecimal.stringByReplacingOccurrencesOfString(",", withString: ".")
    print(dataToDecimal)
    let  decimalReturn = NSDecimalNumber(string: dataToDecimal)
    print(decimalReturn)

    if decimalReturn == NSDecimalNumber.notANumber(){
        return 0.00
    }
    return decimalReturn
}

首先,我认为可能是错误的,但即便如此。它没有用。 第一次打印(转换前)显示例如80,00,但打印(decimalReturn)仅显示80

if行只是检查结果是否不是数字。

3 个答案:

答案 0 :(得分:14)

使用NSNumberFormatter解析您的输入。将其generatesDecimalNumbers属性设置为true:

let formatter = NumberFormatter()
formatter.generatesDecimalNumbers = true

以下是如何使用它,如果你想在解析字符串时返回0:

func decimal(with string: String) -> NSDecimalNumber {
    return formatter.number(from: string) as? NSDecimalNumber ?? 0
}

decimal(with: "80.00")

// Result: 80 as an NSDecimalNumber

默认情况下,格式化程序会查看设备的区域设置以确定小数点标记。你应该这样离开。为了举例,我强迫它使用法语语言环境:

// DON'T DO THIS. Just an example of behavior in a French locale.
formatter.locale = Locale(identifier: "fr-FR")

decimal(with: "80,00")
// Result: 80

decimal(with: "80.00")
// Result: 0

如果您确实希望始终使用逗号作为小数点,则可以设置decimalSeparator属性:

formatter.decimalSeparator = ","

答案 1 :(得分:2)

NSDecimalNumber创建String的方式没有任何问题。但是,如果您的本地格式编号如此,则可能无需担心将句号替换为句点。

它打印80而不是80,00或80.00的原因是print只使用该数字的description属性。如果要自定义格式,则应设置自己的NSNumberFormatter

let number = NSDecimalNumber(string: "80.00")
print(number) // 80
let formatter = NSNumberFormatter()
formatter.minimumFractionDigits = 2
let string = formatter.stringFromNumber(number)
print(string) // 80.0

答案 2 :(得分:0)

当服务器强制某些特定语言环境时,请使用该语言环境代替Locale.current 唯恐您想要根据用户的设置进行破坏

extension String {
    var decimalFromServerString: NSDecimalNumber? {
        let parsed = NSDecimalNumber(string: self, locale: ru_ru_posix)
        if parsed == .notANumber {
            return nil
        }
        return parsed
    }
}

PS。如果由于某种原因将语言环境设置为en_US POSIX,则字符串“ ...”的结果为0。转到图:-[