从字符串中删除多余的零

b0zn9rqh  于 2021-06-24  发布在  Hive
关注(0)|答案(4)|浏览(292)

我想写一个正则表达式从字符串中删除多余的零。 REGEXP_REPLACE(REGEXP_REPLACE("Input_String","^0+", ''),'0+$','') 失败,如果 input_string = 120 那么 output_string = 12 而不是 120 .
以下是预期的输入与输出:

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
iyfamqjs

iyfamqjs1#

只需在hadoop系统中用以下内容保存这个文件delete\u ending\u zeroes\u udf.py。

删除\u结尾\u零\u udf.py

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]))

并在hive编译中编写以下代码

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>

参考文献:https://acadgild.com/blog/hive-udf-python

44u64gxh

44u64gxh2#

如果需要在配置单元中执行相同的操作,请使用cast as decimal(调整到所需的最大精度/比例):

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)
gzszwxb4

gzszwxb43#

regex并不总是最好的工具。在实际代码中,我将使用安迪的解决方案。现在,如果你真的想用正则表达式来做,这里有一种可能的分解方法:
字符串开头: ^ 尽可能多地取0: 0* 在此处开始捕获: ( [0-9]尽可能多地: [0-9]* 字符点(必须转义): \\. [0-9]尽可能少: [0-9]*? 在此处结束捕获: ) 尽可能多的0: 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更具可读性。而且,使用正则表达式并不一定更有效。

6rvt4ljy

6rvt4ljy4#

最简单的方法是使用 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();

相关问题