我当前有一个文本框,需要一定数量的货币,并且用户在文本字段中输入的任何内容(IE 500.00)都将被发送到服务器进行验证,然后再进行操作。
问题是,当用户将其iPhone区域设置为类似法国的数字格式为4 567,89而不是4,567.89的位置时,后端的验证错误,并会认为提供的数字与实际的数字不同是。
因此,我有一个字符串,格式为4 567,89,我想将其转换为格式4,567.89或4567.89
我尝试将NumberFormatter与给定的区域设置一起使用,但无法将4567,89识别为数字,并且失败。
这是我尝试过的:
import React from 'react'
import UserAvatar from './avatar.js'
import { withStyles } from '@material-ui/core/styles'
const UserAvatarHeader = withStyles({
root: {
margin: '2vh',
float: 'right'
}
})(UserAvatar)
export default function PageHeader(props) {
return (
...
<UserAvatarHeader userImage={props.userImage} />
...
)
}
除非这失败,否则因为currencyFormatter.number(from:self)无法从看起来像“ 4 567,89”或类似字符的字符串中创建数字。
关于如何处理在不同区域中格式化的数字的任何想法,这样它就不会通过验证?谢谢。
答案 0 :(得分:1)
我认为您应该将其设备上当前使用的任何语言环境的 string 转换为 NSNumber 。然后将 NSNumber 转换为en_US格式的数字 string ,这正是您的Web服务所期望的。
extension String
{
func toEnglishNumberFormat() -> String?
{
let numFormatter = NumberFormatter() // defaults to current locale
numFormatter.numberStyle = NumberFormatter.Style.currency
numFormatter.isLenient = true // will permit the spaces as separators
guard let num = numFormatter.number(from: self) else
{
return nil
}
numFormatter.locale = Locale(identifier: "en_US_POSIX")
numFormatter.numberStyle = NumberFormatter.Style.decimal
let resultStr = numFormatter.string(from: num)
return resultStr
}
}
我在法语环境中测试了此功能:
let str = "4 567,89"
let engStr = str.toEnglishNumberFormat()
print(engStr ?? "nil")
打印:4567.89