Ios 是否从货币中删除小数点?
我举了以下例子:Ios 是否从货币中删除小数点?,ios,swift,nsdate,Ios,Swift,Nsdate,我举了以下例子: // Currencies var price: Double = 3.20 println("price: \(price)") let numberFormater = NSNumberFormatter() numberFormater.locale = locale numberFormater.numberStyle = NSNumberFormatterStyle.CurrencyStyle numberFormater.maximumFractionDigit
// Currencies
var price: Double = 3.20
println("price: \(price)")
let numberFormater = NSNumberFormatter()
numberFormater.locale = locale
numberFormater.numberStyle = NSNumberFormatterStyle.CurrencyStyle
numberFormater.maximumFractionDigits = 2
我想要有2个摘要的货币输出。如果货币摘要都为零,我希望它们不会显示。所以3,00应该显示为:3
。所有其他值应与两个摘要一起显示
我该怎么做呢?不用NSNumberFormatter,只需使用NSString init(格式:arguments:)
var string=NSString(格式:@“%.2g”参数:价格)
我不擅长斯威夫特,但这应该行得通
不用NSNumberFormatter,只需使用NSString init(格式:参数:)
var string=NSString(格式:@“%.2g”参数:价格)
我不擅长斯威夫特,但这应该行得通
您必须将
numberStyle
设置为.decimal
样式才能设置minimumFractionDigits
属性,具体取决于浮点是否为偶数:
extension FloatingPoint {
var isWholeNumber: Bool { isZero ? true : !isNormal ? false : self == rounded() }
}
您还可以扩展格式化程序并创建静态格式化程序,以避免在运行代码时多次创建格式化程序:
extension Formatter {
static let currency: NumberFormatter = {
let numberFormater = NumberFormatter()
numberFormater.numberStyle = .currency
return numberFormater
}()
static let currencyNoSymbol: NumberFormatter = {
let numberFormater = NumberFormatter()
numberFormater.numberStyle = .currency
numberFormater.currencySymbol = ""
return numberFormater
}()
}
操场测试:
3.0.currencyFormatted // "$3"
3.12.currencyFormatted // "$3.12"
3.2.currencyFormatted // "$3.20"
3.0.currencyNoSymbolFormatted // "3"
3.12.currencyNoSymbolFormatted // "3.12"
3.2.currencyNoSymbolFormatted // "3.20"
let price = 3.2
print("price: \(price.currencyFormatted)") // "price: $3.20\n"
必须将
numberStyle
设置为.decimal
样式,才能根据浮点是否为偶数设置minimumFractionDigits
属性:
extension FloatingPoint {
var isWholeNumber: Bool { isZero ? true : !isNormal ? false : self == rounded() }
}
您还可以扩展格式化程序并创建静态格式化程序,以避免在运行代码时多次创建格式化程序:
extension Formatter {
static let currency: NumberFormatter = {
let numberFormater = NumberFormatter()
numberFormater.numberStyle = .currency
return numberFormater
}()
static let currencyNoSymbol: NumberFormatter = {
let numberFormater = NumberFormatter()
numberFormater.numberStyle = .currency
numberFormater.currencySymbol = ""
return numberFormater
}()
}
操场测试:
3.0.currencyFormatted // "$3"
3.12.currencyFormatted // "$3.12"
3.2.currencyFormatted // "$3.20"
3.0.currencyNoSymbolFormatted // "3"
3.12.currencyNoSymbolFormatted // "3.12"
3.2.currencyNoSymbolFormatted // "3.20"
let price = 3.2
print("price: \(price.currencyFormatted)") // "price: $3.20\n"
如果您处理的是货币,则应使用
NSDecimalNumber
notdouble
,因为double不能准确表示所有需要的值。来自docs:NSDecimalNumber是NSNumber的一个不可变子类,它提供了一个面向对象的包装器,用于执行base 10算术。双精度1.01不能准确表示为:1.01000000000000000888。这个小错误在比较其他问题时很有意义。您可以创建一个名为roundedPrice
的变量,方法是将price
四舍五入到最接近的整数,然后对roundedPrice
应用两位小数。然后,如果price==roundedPrice
,numberformat.maximumFractionDigits=0
,否则,=2
。这只是我脑子里想出来的一些伪代码,但它可能会给你一些想法。@zaph我能把Double转换成NSDecimalNumberNo,不是所有的十进制数都是有效的nsdecimalnumberwithstring:
数字通常是从Sting中创建的,比如用户在文本字段中输入的decimalNumberWithString:
。关键是,一开始就不应该创建double。使用十进制数是一个正确性问题,通常在需要十进制数来反映实际工作(如货币交易)时使用。如果正在计算货币交易且必须正确,则应使用十进制数。如果您正在处理货币交易,则应使用NSDecimalNumber
notdouble
,因为double不能准确表示所有需要的值。来自docs:NSDecimalNumber是NSNumber的一个不可变子类,它提供了一个面向对象的包装器,用于执行base 10算术。双精度1.01不能准确表示为:1.01000000000000000888。这个小错误在比较其他问题时很有意义。您可以创建一个名为roundedPrice
的变量,方法是将price
四舍五入到最接近的整数,然后对roundedPrice
应用两位小数。然后,如果price==roundedPrice
,numberformat.maximumFractionDigits=0
,否则,=2
。这只是我脑子里想出来的一些伪代码,但它可能会给你一些想法。@zaph我能把Double转换成NSDecimalNumberNo,不是所有的十进制数都是有效的nsdecimalnumberwithstring:
数字通常是从Sting中创建的,比如用户在文本字段中输入的decimalNumberWithString:
。关键是,一开始就不应该创建double。使用十进制数是一个正确性问题,通常在需要十进制数来反映实际工作(如货币交易)时使用。如果正在计算货币交易且必须正确,则应使用十进制数字。但是,如果我不使用NSNumberFormatterStyle.CurrencyStyle,则我没有获得货币符号。您可以使用字符串插值添加它。您还可以检查字符串是否有后缀“.00”或“.00”如果为true,请删除最后3个字符。有一种方法可以去除货币符号。您不能简单地搜索“.00”或“.00”的后缀,因为在许多地区,数字部分后面都有后缀。例如,法国有人运行3.0.currency
将导致3,00€
,但如果我不使用NSNumberFormatterStyle.CurrencyStyle,我就得不到货币符号。您可以使用字符串插值添加它。您还可以检查字符串是否有后缀“、00”或“.00”如果为true,请删除最后3个字符。有一种方法可以去除货币符号。您不能简单地搜索“.00”或“.00”的后缀,因为在许多地区,数字部分后面都有后缀。例如,在法国有人运行3.0.currency
会导致3,00€
@zaph,就像在哪种情况下一样?一般问题不在于格式,而在于使用浮点数,其中一系列计算,每一个应该是十进制数的数字都有点偏离,因为实际的数字不能准确地表示,例如1.33。这些小错误可以而且实际上确实是复合的,因此它们在显示时会被取整并导致错误。关键是在必要时使用十进制数字,例如在货币计算中,3密耳变成一整分。刚刚进入决赛