当文本有不同的格式时,将文本转换为浮点数

时间:2013-09-09 15:55:06

标签: mysql

我想将文本存储为浮点数。我的问题是,这个文本有不同的格式,我不能影响它。我的TEXT列包含类似

的字符串

357000

218000.56

500.000.00

转换前两个字符串时没有问题。我在转换最后一个时遇到问题,因为小数点是与千位分隔符相同的字符。

我该如何处理这个问题?是否使用我可以定义的格式显式转换字符串到浮点数?

编辑:我忘了说,在上述情况下,最后一次。 (如果有的话)始终是小数分隔符,如果后跟两位数字。因此,'153.650'应该转换为153650。

4 个答案:

答案 0 :(得分:1)

  

“编辑:我忘了说,在上面的情况下,最后一个。(如果有的话)总是>十进制分隔符,如果后跟两位数字。所以,'153.650'应该转换以> 153650为例。“

有你的答案。

检查索引处的字符(yourString.Length - 3)是否是分隔符之一。如果是,那么你有一个十进制值;如果没有,你就不会。继续去除所有无关的符号,然后在正确的索引处重新插入您选择的小数分隔符。

清洁?不,但情况很糟糕,TBH。

答案 1 :(得分:0)

你可以试试这个

CONVERT(
REPLACE(REPLACE(value, '.', ''), ',', '.'), 
DECIMAL(10,2)) 

这将取代。并且,从您的字符串,并将其转换为十进制(10,2)。 根据你的

SELECT 
  IF(
    LENGTH(
      SUBSTRING_INDEX('351.000', '.', - 1)
    ) >= "3",
    CONVERT(
      REPLACE("351.000", ".", ''),
      DECIMAL (10, 2)
    ),
    CONVERT(
      CONCAT(
    REPLACE(
      LEFT(
        '351.000',
        LENGTH("351.000") - LOCATE('.', REVERSE("351.000"))
      ),
      '.',
      ''
    ),
    CONCAT(
      ".",
      SUBSTRING_INDEX('351.000', '.', - 1)
    )
      ),
      DECIMAL (10, 2)
    )
  ) 

我试过

1234.56给出1234.56

1234.000.00给出1234000.00

和1234.000给出1234000

但这不是在mysql查询中做这么多的好方法。你应该在编程部分处理它

答案 2 :(得分:0)

在将数据提供给SQL之前更正数据 - 编程语言更简单,例如使用正则表达式替换。

s = s.replaceAll("\\D(\\d\\d\\d)", "$1").replaceFirst("\\D". ".");

(不考虑标志!) 它首先删除非数字后跟三位数,然后从第一个剩余的非数字开始。可以做得更聪明。

以上是Java,但正则表达式存在于所有合理的编程语言中。

答案 3 :(得分:0)

SQL Fiddle

MySQL 5.5.32架构设置

CREATE TABLE Table1
    (`TEXT` varchar(10))
;

INSERT INTO Table1
    (`TEXT`)
VALUES
    ('357000'),
    ('218000.56'),
    ('500.000.00')
;

查询1

SELECT CAST(concat(
       REPLACE(CASE WHEN substr(TEXT,-3,1) = "." THEN substr(TEXT,1,length(TEXT)-3)
            ELSE TEXT END,'.',''),
       CASE WHEN substr(TEXT,-3,1) = "." THEN right(TEXT,3) 
            ELSE '' END) AS decimal(12,2)
       ) AS Amount
FROM Table1

<强> Results

|    AMOUNT |
|-----------|
|    357000 |
| 218000.56 |
|    500000 |