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

我有这个代码在kotlin语言:


val stringDecimalvalue = ... // can come as '#,###.##' or '#.###,##' and the two are valid

我想用这个创建一个DoubleString


var monetaryValue = Double(stringDecimalvalue)

如果值是 #,###.## 格式 a 将被引发,那么我需要知道这个模式之前格式化。NumberFormatException


有一种方法可以,我不需要滚动整个字符串或应用具有匹配的正则表达式?(或者可能是一个轻量级的正则表达式方法)


谢谢!


犯罪嫌疑人X
浏览 102回答 2
2回答

胡说叔叔

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

倚天杖

首先,我需要说的是,没有明确格式的通用提议函数的方法没有意义,因为像@gidds和@DodgyCodeException注释一样,它容易受到歧义的影响。因此,我使用按逗号分组的小数点分隔符和倒置情况(按点分组的逗号分隔符)来解决。然后清理逗号并替换点,以便获得我要解析为的无分组点十进制格式regex[0-9]+(,[0-9]{3})*\\.[0-9]{2}[0-9]+(\\.[0-9]{3})*,[0-9]{2}Double我这样做的方式是:extension functionconst 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java