将数字字符串转换为其他区域格式

时间:2018-11-05 02:06:14

标签: ios swift

我当前有一个文本框,需要一定数量的货币,并且用户在文本字段中输入的任何内容(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”或类似字符的字符串中创建数字。

关于如何处理在不同区域中格式化的数字的任何想法,这样它就不会通过验证?谢谢。

1 个答案:

答案 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