我尝试将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行只是检查结果是否不是数字。
答案 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。转到图:-[