为了账号安全,请及时绑定邮箱和手机立即绑定

快速转换为双倍十进制格式的字符串的方法,而无需知道这种格式是什么

快速转换为双倍十进制格式的字符串的方法,而无需知道这种格式是什么

犯罪嫌疑人X 2022-09-07 20:53:25
我有这个代码在kotlin语言:val stringDecimalvalue = ... // can come as '#,###.##' or '#.###,##' and the two are valid我想用这个创建一个DoubleStringvar monetaryValue = Double(stringDecimalvalue)如果值是 #,###.## 格式 a 将被引发,那么我需要知道这个模式之前格式化。NumberFormatException有一种方法可以,我不需要滚动整个字符串或应用具有匹配的正则表达式?(或者可能是一个轻量级的正则表达式方法)谢谢!
查看完整描述

2 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

对我来说最简单的方法似乎是找到最后的外观或并删除之前的所有外观,那么您应该能够使用,...Double::parseString



查看完整回答
反对 回复 2022-09-07
?
倚天杖

TA贡献1828条经验 获得超3个赞

首先,我需要说的是,没有明确格式的通用提议函数的方法没有意义,因为像@gidds和@DodgyCodeException注释一样,它容易受到歧义的影响。


因此,我使用按逗号分组的小数点分隔符和倒置情况(按点分组的逗号分隔符)来解决。然后清理逗号并替换点,以便获得我要解析为的无分组点十进制格式regex[0-9]+(,[0-9]{3})*\\.[0-9]{2}[0-9]+(\\.[0-9]{3})*,[0-9]{2}Double


我这样做的方式是:extension function


const val NOTHING = ""

const val COMMA = ","

const val POINT = "."


val commaGrouped = "[0-9]+(,[0-9]{3})*\\.[0-9]{2}".toRegex()

val pointGrouped = "[0-9]+(\\.[0-9]{3})*,[0-9]{2}".toRegex()


fun String.commaCleaned() = replace(COMMA, NOTHING)


fun String.pointCleaned() = replace(POINT, NOTHING)


fun String.commaToPoint() = replace(COMMA, POINT)


fun String.pointToComma() = replace(POINT, COMMA)



fun String.toDouble() =

    when {

        commaGrouped matches this -> Double(commaCleaned())

        pointGrouped matches this -> Double(pointCleaned().commaToPoint())

        else -> throw IllegalArgumentException(

            "the value ${this} can't be converted to ${Double::class.java} " +

                "have match ${commaGrouped.pattern} " +

                "or ${pointGrouped.pattern}")

    }

意识到整数格式或超过两个小数精度将不匹配以创建 ,这也是我想要的。Double


查看完整回答
反对 回复 2022-09-07
  • 2 回答
  • 0 关注
  • 101 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信