1

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

357000

218000.56

500.000.00

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

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

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

4

4 回答 4

1

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

这就是你的答案。

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

干净的?不,但情况很糟糕,TBH。

于 2013-09-09T16:45:50.690 回答
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 查询中做这么多的好方法。你应该在编程部分处理它

于 2013-09-09T15:58:54.590 回答
0

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

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

(不考虑符号!)它首先删除非数字,然后是三个数字,然后从第一个剩余的非数字中取出一个句点。可以做得更聪明。

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

于 2013-09-09T16:25:05.643 回答
0

SQL小提琴

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

结果

|    AMOUNT |
|-----------|
|    357000 |
| 218000.56 |
|    500000 |
于 2013-09-09T17:13:40.857 回答