ios - 四舍五入货币值(SwiftUI、Core Data)
问题描述
我正在尝试在 SwiftUI 中创建一个简单的 TextField,它将提供的值格式化为货币的有效值。我需要将值四舍五入为 2 位数。并使用 Core Data 存储舍入值(我知道该怎么做,我使用的是 Decimal 类型,顺便说一句)。
到目前为止,我有这个:
import SwiftUI
struct ContentView: View {
@State private var newValueAsString = ""
@State private var value: NSDecimalNumber = 0
let decimalBehavior = NSDecimalNumberHandler(roundingMode: .plain, scale: 2, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: true)
var body: some View {
VStack {
TextField("0", text: $newValueAsString, onCommit: {
self.value = NSDecimalNumber(string: self.newValueAsString).rounding(accordingToBehavior: self.decimalBehavior)
print("\(self.value)")
}
)
.multilineTextAlignment(.trailing)
.font(Font.system(size: 30))
.keyboardType(.decimalPad)
// Just to test. Later I will save the value to Core Data.
Text("\(self.value)")
}
.padding()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
问题
当 iOS 区域使用逗号而不是点(例如,波兰)时,它无法正常工作。十进制键盘有“,”而不是“。” 当我使用“,”时,数字没有正确四舍五入。123,456 变为 123。并且使用点的区域(例如,美国)123.456 变为 123.46,如预期的那样。
我在这里想念什么?我的猜测是 NumberFormatter,但我无法让它工作。
解决方案
NSDecimalNumber
可以用字符串和语言环境初始化。
该文档明确提到语言环境用于解释小数点分隔符(强调我的):
locale:定义用于解释 numericString 中数字的语言环境(特别是小数分隔符)的字典 (!)。
因此,您可以执行以下操作:
// Here I am passing the current Locale but you should pass whatever makes sense to your input
self.value = NSDecimalNumber(string: self.newValueAsString, locale: Locale.current).rounding(accordingToBehavior: self.decimalBehavior)
例子:
print(NSDecimalNumber(string: "100.50", locale: Locale(identifier: "en_US"))) // => 100.5
print(NSDecimalNumber(string: "100,50", locale: Locale(identifier: "el_GR"))) // => 100.5
推荐阅读
- python - 查找子目录的大小
- java - 无法在 Selenium 的 textarea 中找到元素
- python-3.x - 从张量 Pytorch 批量采样数据
- python - 如何使用 Django 3.0 制定这个复杂的数据库查询?
- chart.js - Chart.js 条形图更改宽度(不重复条形宽度问题!)
- snowflake-cloud-data-platform - Snowflake 试用帐户中缺少默认数据库
- python - 如何使用 Pyrebase 检查 Django 中所有视图的身份验证?
- python - 在对多元 LSTM 模型进行多步预测时拟合模型时出现错误
- go - AWS API Gateway 上的 Golang Lambda 函数不返回 PDF
- amazon-web-services - 如何使用 Cognito 在 Lambda 中验证客户端发送的会话令牌