使用更改长度删除十进制值的尾随零

时间:2011-11-01 15:10:45

标签: mysql

我有一个程序,我正在显示赔率,但客户只想显示有效数字。因此,1.50将显示为“1.5”,而1.00将显示为“1”。

如何让MySQL不显示尾随零;

即。在数据库中:

  

赔率
  1.500
  23.030
  2.000
  4.450

将显示为

  

1.5
  23.03
  2
  4.45

感谢您的帮助

15 个答案:

答案 0 :(得分:54)

到目前为止最简单的方法,只需添加零!

示例:

SET 
    @yournumber1="1.500", 
    @yournumber2="23.030",
    @yournumber3="2.000",
    @yournumber4="4.450"
;

SELECT 
    (@yournumber1+0),
    (@yournumber2+0),
    (@yournumber3+0),
    (@yournumber4+0)
;

+------------------+------------------+------------------+------------------+
| (@yournumber1+0) | (@yournumber2+0) | (@yournumber3+0) | (@yournumber4+0) |
+------------------+------------------+------------------+------------------+
|              1.5 |            23.03 |                2 |             4.45 |
+------------------+------------------+------------------+------------------+
1 row in set (0.00 sec)

如果您的值来自的列是DECIMAL或NUMERIC类型,则首先将其强制转换为字符串,以确保转换发生...例如:

SELECT (CAST(`column_name` AS CHAR)+0) FROM `table_name`;

对于更短的方法,只需使用任何内置字符串函数进行强制转换:

SELECT TRIM(`column_name`)+0 FROM `table_name`;

答案 1 :(得分:42)

编辑:我会使用Christopher McGowan的答案 - 将值加0,这样会更好。


如果进行修剪,检查实际上是否有小数点非常重要。

所以我认为你想要使用:

SELECT TRIM(TRAILING '.' FROM TRIM(TRAILING '0' from yourfield)) AS yourfield
FROM yourtable
WHERE yourfield LIKE '%.%'

答案 2 :(得分:8)

这对我有用..将字段围绕2位小数,然后修剪任何尾随零

所以2.10是2.1

SELECT trim(round(FIELDNAME,2))+0 
FROM tbl_name
....

答案 3 :(得分:3)

请使用以下功能,它将照顾没有小数位的零号,即150等......

 SET @saved_cs_client     = @@character_set_client;
 SET character_set_client = utf8;
 DELIMITER $$
 USE `mydbname`$$

 DROP FUNCTION IF EXISTS `FN_STRIP_TRAILING_ZER0`$$

 CREATE DEFINER=`mydbuser`@`%` FUNCTION `FN_STRIP_TRAILING_ZER0`(tNumber DECIMAL(10,7)) RETURNS VARCHAR(20) CHARSET utf8

 BEGIN
     DECLARE strBuff VARCHAR(20);
     DECLARE cnt  NUMERIC(2);
     DECLARE tString VARCHAR(20);
     SELECT CAST(tNumber AS CHAR) INTO tString;
     SELECT LOCATE('.',tString) INTO cnt;
     IF cnt > 0 THEN
       SELECT TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM tString)) INTO strBuff;   
     ELSE
       SET strBuff = tString;
     END IF;
     RETURN strBuff;
 END$$
 DELIMITER ;
 SET character_set_client = @saved_cs_client;

附录:

通常调用此方法将涉及:      SELECT FN_STRIP_TRAILING_ZER0(1.5);

答案 4 :(得分:2)

提出@fooquency提供的答案,如果列已经被声明为DECIMAL,在DECIMAL(M,D)中D为非零值,我们不需要执行WHERE条件

WHERE yourfield LIKE '%.%'

因为列中的值将始终包含小数点后的D位(。)

答案 5 :(得分:1)

要从DECIMAL / NUMERIC或字符串类型列中删除尾随零,您只需将值强制转换为DOUBLE,例如:

SELECT CAST(mycol AS DOUBLE) from mytable;

实际上,其他答案中提到的“加零”技巧也一样,但是以更间接(且可能效率更低)的方式进行,例如:

SELECT CAST(mycol AS CHAR)+0 FROM mytable; -- converts to string, then to number
SELECT TRIM(mycol)+0 FROM mytable; -- ditto

答案 6 :(得分:0)

使用ROUND或CEILING,在查询中只需键入:

SELECT ROUND(2/50) 

SELECT CEILING(2/50)

答案 7 :(得分:0)

在我无法修改代码和SQL查询的情况下,我遇到了类似的问题,但我被允许修改数据库结构。所以我将列格式从DECIMAL更改为FLOAT,它解决了我的问题。

答案 8 :(得分:0)

SELECT TRIM(TRAILING '.' FROM TRIM(TRAILING '0' from yourfield)) AS yourfield
FROM yourtable
WHERE yourfield LIKE '%.%'

SELECT TRIM(TRAILING '.' FROM TRIM(TRAILING '0' from yourfield)) AS yourfield
FROM yourtable
WHERE instr(yourfield,'.') != 0

工作正常但需要"其中"子句。

我认为最好的解决方案可能是:

SELECT TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM ROUND(yourfield,3))) 
FROM yourtable

因为它不需要"其中"条款,不需要任何特殊代码, 并且还允许您预先设置数字的最大精度。

答案 9 :(得分:0)

我找到的最佳解决方案是将您的舍入值转换为FLOAT:

SELECT CAST(ROUND(1.2345984372, 2) AS FLOAT)

答案 10 :(得分:0)

尝试使用简单更新查询以删除十进制零

SELECT TRIM(TRAILING '.00' FROM price_column)
FROM table_name

答案 11 :(得分:0)

这对我有用:

单栏:

SELECT TRIM(column_name)+0 AS column_name FROM table_name;

多列:

SELECT 
TRIM(column1)+0 AS column1,
TRIM(column2)+0 AS column2,   
TRIM(column3)+0 AS column3,
FROM table_name;

答案 12 :(得分:0)

在此页面中其他答案的片段中,我得出了以下结论:

SELECT ( IF(
    myfield LIKE '%.%', 
    TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM myfield)),
    myfield
) ) FROM mytable

欢呼

答案 13 :(得分:-1)

SELECT TRIM(TRAILING '0' FROM yourodds)
FROM ...

TRIM function的文档。

答案 14 :(得分:-2)

如果您使用PHP作为脚本语言,则可以使用以下内容:

$var = (float)$var_having_extra_0; // $var = (float) 17.5000

或使用PHP floatval函数:

$var = floatval($var_having_extra_0); // $var = floatval(17.5000)