`

[转]把字母数字串转换为数值

 
阅读更多

http://www.blogjava.net/jxhkwhy/articles/200495.html

问题:对于字母数字的数据,只返回数字值。从字符串“paul123f321”中返回123321。

解决方案

DB2

使用函数TRANSLATE和REPLACE,从字母数字串中提取数字字符:

 select cast(

         replace(

       translate( 'paul123f321',

                  repeat('#',26),

                  'abcdefghijklmnopqrstuvwxyz'),'#','')

         as integer ) as num

    from t1


Oracle和PostgreSQL

使用函数TRANSLATE和REPLACE,可以从包含字母数字的字符串中提取数字字符:

 select cast(

         replace(

       translate( 'paul123f321',

                  'abcdefghijklmnopqrstuvwxyz',

                 rpad('#',26,'#')),'#','')

         as integer ) as num

   from t1 
  

MySQL和SQL Server

到本书编写时为止,这两个供应商都不支持TRANSLATE函数,因此这里不能给出解决方案了。

讨论

两种解决方案的唯一差别是语法,DB2使用函数REPEAT代替RPAD,而且TRANSLATE参数列表的顺序也不同。以下的解释采用了Oracle/PostgreSQL解决方案, DB2也类似。如果从里向外运行该查询(仅仅从TRANSLATE开始),就会发现这非常简单。首先,TRANSLATE把非数字字符转换为“#”:

select translate( 'paul123f321',

                   'abcdefghijklmnopqrstuvwxyz',

                   rpad('#',26,'#')) as num

   from t1


NUM

-----------

####123#321

由于现在所有非数字字符都用“#”表示了,因此只需使用REPLACE去掉它们,然后把结果转换为数值。这个特殊的例子尤其简单,因为字符串中只有字母和数字。如果还有其他字符,那么用另一种方法会更容易:不是找出非数字字符并去掉它们,而是找出所有数字字符,并去掉不属于这些字符范围的其他字符。下面的例子会有助于理解这种技巧:

select replace(

      translate('paul123f321',

        replace(translate( 'paul123f321',

                           '0123456789',

                           rpad('#',10,'#')),'#',''),

                rpad('#',length('paul123f321'),'#')),'#','') as num

   from t1


NUM

------

123321

较之原始方案,该解决方案看起来有点儿费解,但如果把它分解开来就容易理解了。观察一下最内层的TRANSLATE调用:

select translate( 'paul123f321',

                   '0123456789',

                   rpad('#',10,'#'))

   from t1


TRANSLATE('

-----------

paul###f###

与原来方案不同的是,它没有用“#”字符替换每个非数字字符,而是用“#”字符替换所有数字字符。接下来,去掉所有“#”,这样,只剩下非数字字符:
select replace(translate( 'paul123f321',

                           '0123456789',

                           rpad('#',10,'#')),'#','')

   from t1


REPLA

-----

paulf

下一步,再次调用TRANSLATE,这次用“#”字符替换原始字符串中的所有非数字字符(前面查询的结果):

select translate('paul123f321',

        replace(translate( 'paul123f321',

                           '0123456789',

                           rpad('#',10,'#')),'#',''),

                rpad('#',length('paul123f321'),'#'))

   from t1


TRANSLATE('

-----------

####123#321

到这里停一停,检验一下最外层的TRANSLATE调用。RPAD的第二个参数(DB2中REPEAT的第二个参数)是原始字符串的长度。这样做很方便,因为是没有任何字符出现的次数会比它所在的整个字符串长。现在,用“#”字符替换所有非数字字符;最后一步,使用REPLACE去掉所有“#”。至此,仅剩下数字。

_______________________________________

考虑小数点的话 把 ‘0123456789’ 换成 ‘.0123456789 ’
不过潜在着小数点位置的问题、暂不考虑。
分享到:
评论

相关推荐

    labview字符串大小写转换

    使用labview实现字符串大小写转换,开发环境为labview8.2

    matlab 字符串处理函数

    % blanks(n) 创建有n个空格组成的字符串 % deblank(str) 裁切字符串的尾部空格 ...% str2num 将数字字符串转换为数字 % mat2str 将数组转换成字符串 % int2str 把数值数组转换为整数数字组成的字符数组

    Lua判断变量是否为数字、字符串是否可以转换为数字等

    主要介绍了Lua判断变量是否为数字、字符串是否可以转换为数字等,本文讲解了Lua 判断是字符还是数字的方法、Lua判断数字的方法、判断可否转换为数字的方法、判断并且准备一个初值的方法,需要的朋友可以参考下

    Java实现的Excel列号数字与字母互相转换功能

    主要介绍了Java实现的Excel列号数字与字母互相转换功能,涉及java针对Excel相关数值与字符串操作技巧,需要的朋友可以参考下

    python将字母转化为数字实例方法

    是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的...

    日期向量/数字到 ISO 8601 日期字符串:将日期向量/数字转换为 ISO 8601 日期字符串。 令牌控制日期/时间表示法。-matlab开发

    将日期时间或日期向量或序列日期号轻松转换为日期字符串。 日期字符串可以是ISO 8601时间戳,也可以是单个日期/时间值,由(可选)输入令牌选择。 多个令牌可用于输出多个字符串。 此函数支持的 ISO 8601 时间戳...

    ZYZMZM#Coding-Interviews#67. 把字符串转换成整数1

    输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0示例1输入输出int StrToInt(string

    Visual C++开发经验技巧宝典(第2章)

    0097 字符串数值转换 40 2.3 字符串截取与转换 41 0098 获取字符串中的中文 41 0099 英文字符串首字母大写 41 0100 指定符号分割字符串 42 0101 在文本中删除指定的中文或中文句子 43 0102 替换指定的...

    vbnet程序设计实验002.doc

    用Val函数将数字字符串转换为数值。 3. 练习Left$、Righit$、Mid、Len、InStr、Ucase和Lcase等字符串函数的使用。 三、实验步骤与指导 1. 随机生成大小写字母 (1)设计界面及设置属性 在窗体上放置两个命令按钮,将...

    《Python语言程序设计》第三次平时作业,25道编程题和100道单项选择题

    下面程序的功能是从键盘读入一个由阿拉伯数字组成的字符串(中间可以包含一个小数点),如果它是正整数,就删去其左端的所有0字符,如果它是正小数,就删去其两端的所有0字符,最后再将它转换为数值型数据(int或...

    VBSCRIPT中文手册

    LCase 函数 返回已被转换为小写字母的字符串。 Left 函数 返回字符串最左边的指定数量的字符。 Len 函数 返回字符串中的字符数量,或者存储变量所需的字节数。 Length 属性 返回在搜索字符串中匹配的长度。 ...

    vb Script参考文档

    UCase 函数 返回的字符串已经被转换为大写字母。 Value 属性 返回在搜索字符串中已发现匹配的值或正文。 VarType 常数 定义变体子类型的常数列表。 VarType 函数 返回标识变体子类型的数值。 VBScript 常数 在 ...

    VBScript 语言参考中文手册CHM

    UCase 函数 返回的字符串已经被转换为大写字母。 Value 属性 返回在搜索字符串中已发现匹配的值或正文。 VarType 常数 定义变体子类型的常数列表。 VarType 函数 返回标识变体子类型的数值。 VBScript 常数 在 ...

    VBScript 语言参考

    LCase 函数 返回已被转换为小写字母的字符串。 区域设置 ID (LCID) 图表 区域设置 ID 及其相关值列表. Left 函数 返回字符串最左边的指定数量的字符。 Len 函数 返回字符串中的字符数量,或者存储变量所需的字节...

    VBSCRIP5 -ASP用法详解

    LCase 函数 返回已被转换为小写字母的字符串。 区域设置 ID (LCID) 图表 区域设置 ID 及其相关值列表. Left 函数 返回字符串最左边的指定数量的字符。 Len 函数 返回字符串中的字符数量,或者存储变量所需的字节...

    自己实现的atoi函数

    atoi函数,自己实现的。通过输入字符串,实现数字。如果是字母,则转换为相关的对应的数值。

    delphi 开发经验技巧宝典源码

    0121 使用StrToBool函数将字符串转换为布尔类型 81 4.6 对话框函数 81 0122 使用InputBox函数显示输入对话框 81 0123 使用MessageDlg函数显示不同风格的对话框 81 0124 使用CreateMessageDialog函数创建...

    FreeMark学习笔记

    2,插值结果为数字值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子: ${answer} ${answer?string} ${answer} --> ${answer?string.number} ${...

    text_encoders:一些文字编码器

    函数使用map将大写字母转换为数字代码,不需要转换小写字母,因为在一般函数“ ENCODER”(每个字符都调用适当的函数)中,文本中的每个字母都会转换为大写字母。摩尔斯编码器该编码器是一个具有一个char参数并返回...

Global site tag (gtag.js) - Google Analytics