【问题标题】:How to pad zeroes for a number field?如何为数字字段填充零?
【发布时间】:2016-03-24 11:22:00
【问题描述】:

如何在左边用零填充整数 (lpad),在小数点分隔符后用右边的零填充小数点 (rpad)。

例如:如果我有 5.95,我想得到 00005950(不带分隔符)。

【问题讨论】:

  • 您的数据库中是否有类似 sprintf() 的东西?这将是最简单、最易读的方法。

标签: sql oracle oracle-data-integrator


【解决方案1】:

如果您希望该值达到千分之一但不超过小数部分,则可以乘以 1000 并使用FLOOR 或使用TRUNC。像这样:

SELECT TO_CHAR( TRUNC( value * 1000 ), '00000009' )
FROM   table_name;

或:

SELECT LPAD( TRUNC( value * 1000 ), 8, '0' )
FROM   table_name;

使用TO_CHAR 将只允许基于格式掩码设置的最大位数(如果值超过此大小,则它将显示#s 而不是数字)但它会处理负数(将前导零前的减号)。

使用LPAD 将允许任何大小的输入,但如果输入为负数,则减号将位于字符串的中间(在任何前导零之后)。

【讨论】:

  • 我更喜欢这个 SELECT LPAD( TRUNC( 5.9516 * 1000 ), 8, 0 ) FROM dual;
  • 在考虑输入长度和负值时,我开始使用它,然后对其进行了更新,现在将其放回原处,并稍微介绍了两个版本的优缺点。
  • 格式掩码将给出 9 个字符的结果;您将有一个正值的前导空间,您可以使用 FM 修饰符摆脱它;负值仍然是 9 个字符。这当然可以。 (而且你已经删除了它总是 8 个字符的问题!)
  • 很好,也许我需要其他东西,例如如果我有 5.9516(第四位 > 5 所以我们将三位数字增加 1 。例如,如果我有 5.9516 我将得到 00005952 而不是 00005951
  • @Abderrahim - 只需使用 ROUND() 而不是 TRUNC()?
【解决方案2】:

乘法和lpad()怎么样:

select lpad(col * 1000, 8, '0')
. . .

【讨论】:

  • 是的,你说得对,但是如果我在小数点分隔符后有超过 3 位数字,例如 5.9562,我会得到 5956.2
【解决方案3】:

尝试以下方法:

select lpad(5.42562 * POWER(10, length(trim(regexp_replace(5.42562, '[^.]+\.(.*)$', '.\1')))-1), 8, '0') from dual;

其中 5.42562 将是您想要的列。

所以基本上,您使用的是 Gordon Linoff 的答案,但乘以 10 的小数位数。

【讨论】:

  • 我只需要保留小数点后3位
  • "并在小数点分隔符后用右边的零填充小数点 (rpad)。"没有从你的问题中得到这个:(。我想我的方法不适合你。
【解决方案4】:

select lpad(rpad(replace('5.95','.',''),4,0),8,0) from dual;

假设您有规模或没有规模,string 必须是 0 的后缀和 0 前缀直到第 8 位。我正在发布查询。

让我知道这是否满足您的要求或需要其他任何东西。

select lpad(rpad(replace('5.95','.',''),4,0),8,0) from dual;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2014-10-27
    相关资源
    最近更新 更多