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
not
double
,因为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
not
double
,因为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密耳变成一整分。刚刚进入决赛