我想编写一个正则表达式来从字符串中删除多余的零。
如果input_string = 120则output_string = 12而不是120,则REGEXP_REPLACE(REGEXP_REPLACE("Input_String","^0+", ''),'0+$','')
失败。
以下是预期的输入与输出:
120--> 120
12--> 12
120.00--> 120
000329.0--> 329
14.4200--> 14.42
000430--> 430
0.24000--> 0.24
0.100--> 0.1
1.0--> 1
答案 0 :(得分:3)
最简单的方法是使用BigDecimal
:
String stripped = new BigDecimal(input).stripTrailingZeros().toString();
编辑:这实际上不适用于000430
:它的字符串表示形式是4.3E+2
。
您可以通过确保scale
至少为零来解决此问题:
BigDecimal b = new BigDecimal(input).stripTrailingZeros();
if (b.scale() < 0) {
b = b.setScale(0, RoundingMode.UNNECESSARY);
}
String stripped = b.toString();
答案 1 :(得分:1)
正则表达式并不总是最好的工具。在真实的代码中,我将使用Andy的解决方案。现在,如果您真的想使用正则表达式来进行分解,这是分解它的一种可能方法:
^
0*
(
[0-9]*
\\.
[0-9]*?
)
0*
$
这是代码。注意:它不处理整数,但可以类似的方式处理
Pattern pattern = Pattern.compile("^0*([0-9]*\\.[0-9]*?)0*$");
Matcher matcher = pattern.matcher("010.02010");
if(matcher.find()) {
System.out.println("group 1 : " + matcher.group(1));
}
输出:
group 1 : 10.0201
如您所见,解析为BigDecimal更具可读性。同样,使用正则表达式不一定更有效。
答案 2 :(得分:1)
如果您需要在Hive中执行相同的操作,请使用强制转换为十进制(调整为所需的最大精度/比例):
select cast(str as decimal(30,5)) as fixed_number
from
(--test dataset
select stack(9,
'120',
'12',
'120.00',
'000329.0',
'14.4200',
'000430',
'0.24000',
'0.100',
'1.0'
) as str
)s;
结果:
OK
120
12
120
329
14.42
430
0.24
0.1
1
Time taken: 0.519 seconds, Fetched: 9 row(s)
答案 3 :(得分:0)
只需将此文件delete_ending_zeroes_udf.py保存在hadoop系统中,内容如下。
import sys
import string
import re
def delete_ending_zeroes(x):
if '.' in x:
y = re.sub("0+$","", str(x))
if len(y.split('.')[1])==0:
y = y.split('.')[0]
else:
y = re.sub("^0+","", str(x))
return y
while True:
line = sys.stdin.readline()
if not line:
break
line = string.strip(line, "\n ")
Input_String = line.strip()
outut_string = delete_ending_zeroes(Input_String)
print("\t".join([Input_String, outut_string]))
#
并在配置单元编译中编写以下代码
add file hdfs:///delete_ending_zeroes_udf.py;
SELECT TRANSFORM (Input_String)
USING 'python delete_ending_zeroes_udf.py' AS
(outut_string string)
FROM <your_hive_table>