19阅读网  |  最近更新  |  TAG  | 
19阅读网
当前位置:首页 > 去数字分隔符

去数字分隔符

来源:互联网 时间:2017-07-13 阅读: 手机版

篇一:去数字分隔符

不过今天西西教您用Word必备工具箱帮您实现这个功能:

前一段时间给大家介绍了用手工方法给word中的数据添加千位分割符,比如:76,656.251351,为了更加方便,本人特地制作了这个功能,实现一键操作,还不赶紧试一试。

动画演示:

自动给word文档里的数据设置“千位分隔符”

去除当前文档中数值的千位分隔符(就是数值中的那个小逗号)

动画演示:

word必备工具箱--去除千位分隔符功能

巧给word文档里的数据设置“千位分隔符”高级版

我们在word文档中会写很多数据,有些带小数点,有些不带,但为了直观,需要把这些数据全部设置为“千位分隔符”的格式,如:100000.00元,转换为100,000.00元(每3位数加一个英文半角逗号)。手工添加,既费时费力,效率低,还会出错;用编制宏代码的方法,又不易学会。有没有一种简单的方法在数据里设置千位分隔符呢?答案是肯定的。在实际工作中,通过“全部替换”按钮,就能完成整篇文档财务数据千位分隔符的添加,并且年份数字不受影响。具体方法如下:

(1)用CTRL+H快捷键,或者点击菜单或按钮:

2007以下版本,点击word中的“编辑”菜单,在下拉菜单中点“替换”,出现“查找和替换”对话框。

2007及以上版本,则在功能区点击“编辑”按钮,再点击 替换 ,

 如图:

 

(2)2007以下版本,点“高级”按钮; 2007及以上版本,点“更多”按钮,勾选“使用通配符”复选框。

(3)“查找内容”中填入: ([0-9])([0-9]{3})([!][0-9年]),“替换”中填入:\1,\2\3

注意:查找内容:([0-9])([0-9]{3})([!][0-9年])和替换为: \1,\2\3是固定不变的,在输入法为英文半角的状态输入。

(4)执行“全部替换”。重复按“全部替换”按钮,直到提示“替换0处”为止。

 

 

查找框中“([0-9])([0-9]{3})([!][0-9年])”的含义是:

()[ ]{ }称为:通配符。

( ) 表达式,[ ] 范围内的任意单个字符,{ } 指定前一范围次数(勾选 “使用通配符”复选框让通配符设定的条件起作用)。

意思是:查找不是0-9或者“年”之前的三位以上的数字(WORD默认从左到右顺序查找)。

替换框中“\1,\2\3”的含义是:\1代表查找框中第一个表达式,\2代表查找框中第二个表达式,以此类推。意思是:按从左到右的顺序,在不是0-9或者“年”前的第四位数字后加千分位符(,)。如:10000000.00元,按第一次“全部替换”按钮为:10000,000.00元,按第二次“全部替换”按钮为:10,000,000.00元,按第三次“全部替换”按钮为:“替换0处”完成。

那么,又该如何批量取消千位分隔符呢?

CTRL+H调出“查找和替换”对话窗口,勾选“使用通配符”。

在“查找内容”框中填入:([0-9]),([0-9])

在“替换为”框中填入:\1\2

执行“全部替换”。如图:

后记:

由于word的替换功能也不是万能的,由于通配符里只有“非”运算符没有“或”运算,如果数据的小数点后有4位数字,比如1.3527,也会被加上英文逗号,好在word文档中小数点后保留四位的情况并不多前。

篇二:去数字分隔符

为何数字分隔符三位一隔?   对于数学上的大数书写,人们习惯每隔三位加上一个“,”作为分隔符,例如“9,876,543,210”,为什么要这么分呢?有人说方便认读,而且国际上都这么记录的。这说法后半句倒是不假,可前半句就难说了。比如我看到那一串数字,仍然是从末开始一位一位数上去,并没有感觉到方便。

 也有人说,这是有口诀的:“个十百千万,三位分一段;头撇前位千,百万二撇前;三撇前十亿,好读又好记。”试想一下,如果四位一隔,98,7654,3210,不用口诀啊,直接读九十八亿七千六百五十四万三千二百一十。

 问题到底出在哪呢?原来是汉语和英语的进率不同造成的。

 英语里没有“万”、“亿”,而是有“百万(million)”、“十亿(billion)”、“万亿(trillion)”,千位分隔符就是这么产生的:

1,000  onethousand一千

1,000,000  onemillion一百万

1,000,000,000  onebillion十亿

1,000 ,000,000,000 trillion 万亿

 汉语就不同了,汉语从古至今都是以万为递进,在东汉《数述记遗》记载:万万为亿、万亿为兆、万兆为京……

为何数字分隔符三位一隔?

 清代的《数理精蕴》中记载了一套融合了印度的古代数字名称:个、十、百、千、万、亿、兆、京、垓、秭、穰、沟、涧、正、载、极、恒沙河、阿僧只、那由他、不可思议、无量数。比个位小的数,按十分之一递减,依次为分、厘、毫、丝、忽、微、纤、渺、漠、模、糊、逡巡、须臾、瞬息、弹指、刹那、六德、虚空、清静。

 可见,数字分隔符三位一隔仅是满足西方语言的需要,到了中国用起来就成了削足适履了。

为何数字分隔符三位一隔?

篇三:去数字分隔符

编程时,我们有时可能需要对数字每3位一隔地添加逗号。在会计行业,这个专门术语叫"千位分隔符"。每三位一隔是西方人的习惯,这样做的目的是便于读数。而且只对整数作千位分隔,小数部分不作分隔。(不过,我觉得这种千位分隔符并不符合中国人的习惯,这样做反而不便于读数。) 由于小数部分是不作分隔的,所以,简单起见,我们在这里只讨论数据是整数的情况。言归正传,怎么实现对数字每3位一隔地添加逗号呢?① Java本身提供了一些函数可供使用,比如下列方式:

public static String formatNumber1( String num ){ num = num.replaceAll(",", ""); // 去掉所有逗号 java.text.DecimalFormat df = new java.text.DecimalFormat("##,###,###"); return df.format( Double.parseDouble( num ) );

当然,还有其他的函数可供使用,这里就不举例了。

这么做有个缺点,当数字很大时,转换就会出错了。

比如,1234567890123456789 会变成1,234,567,890,123,456,770 这样的数据显然不是我们想要的。② 此外,一些数据库(比如Oracle)也提供了数字的添加分隔符的方法。

SELECT TO_CHAR( TO_NUMBER("12345678901234567890"), "FM999,999,999,999,999,999,999" ) AS JIN_E FROM DUAL

这种方法在从数据库中取数据直接显示在页面上时很有用,因为不需要再通过Java循环来添加分隔符了。但,有个地方要注意: 在程序中,拼SQL语句时,必须要保证FM999,999,999,999,999,999,999这个串中的9的个数要多余传入的变量的值的数字的个数。否则就得不到正确的值,得到的是一串#############。③ 还是回到Java,在①的方法中,已经提到,这种方法只在数字不是特别大时有效,当数字很大时,将返回一个不正确的数据。

那么,如何对超长数据添加分隔符呢? 一般,很容易想到用字符串循环的方式来添加,比如象下面这样的代码:

public static String formatNumber2( String num ){ num = num.replaceAll(",", ""); // 去掉所有逗号 StringBuffer ret = new StringBuffer(); for( int i = num.length()-1; i≥0; i-- ){ ret.append( num.charAt(i) ); if( (num.length()-i)%3==0 ){ ret.append(","); return ret.reverse().toString();

采用这种方法,就不怕超长数据了。④ 除了上述方法外,其实还有其他方法,比如采用正则表达式。

下面我就介绍几个用正则表达式来给超长数据添加分隔符的办法。实现的代码如下:

public static String formatNumber3( String iniNum, int split ){ // 去掉所有逗号 String retNum = Pattern.compile(",").matcher( iniNum ).replaceAll(""); retNum += ","; // 末尾加个逗号,作为下列正则表达式的替换的基准 // 查找这样的串:连续split位数字的串,其左边有个数字,其右边有个逗号 Pattern p = Pattern.compile("(?〈=\\d)(\\d{" + split + "})(?=,)"); for( Matcher m=p.matcher( retNum ); m.find(); ){ // 把这样的串替换为左边加逗号的串 retNum = m.replaceFirst(",$1"); // 括号会记为变量,依次为$1,$2… m = p.matcher( retNum ); // 替换后的串再次进行规则匹配,直到结束。

return Pattern.compile(",$").matcher( retNum ).replaceFirst("");

正则表达式是,简单地说,就是一种用来描述字符串文本的查找和替换的规则。可以理解为是一种字符串的查找和替换的工具。

正则表达式被很多高级语言所支持,如Perl, Java, C#等, 甚至包括JavaScript。

不过,由于各种语言对正则表达式的理解及实现上有所差异,正则表达式也呈现各种流派或方言。

使用时,具体细节上会不相同,不一定能互相套用,这点要注意。

正则表达式具有"易写难读"的特点,可能不太好理解,所以,上述代码,我添加了很多注释。

上述数字串的匹配规则中,用到了"肯定逆序环视"和"肯定顺序环视"。

环视的括号不会被记录成象$1这样的变量,它只是记录一个"位置",所以不会消耗掉串中的字符。

(?〈=…)的形式为肯定逆序环视,意思是: 某个位置,其左侧符合…的条件 (?=...)的形式为肯定顺序环视,意思是: 某个位置,其右侧符合…的条件 此外,还有否定的环视。

(?〈!…)的形式为否定逆序环视,意思是: 某个位置,其左侧不符合…的条件 (?!...)的形式为否定顺序环视,意思是: 某个位置,其右侧不符合…的条件 ( 可能由于翻译的不同,有些地方,采用正向零宽断言,负向零宽断言之类的术语,其实是一个意思。) 正则表达式理论上是支持从右向左的查找和替换的,但这还得靠宿主语言来实现。

但是,在Java中,似乎没实现,所以,在上述代码中,只能用循环来做了。

上述代码是前几天写的,还不够简洁。

今天在码这篇文章的时候,突然想到,可以把规则再适当修正一下,将肯定顺序环视改成否定顺序环视,就不需要先在串尾添加逗号,然后在函数返回之前再去除逗号了。

立刻修改代码试了一下,果然可以。

^_^修改后的代码如下:

public static String formatNumber4( String iniNum, int split ){ String retNum = iniNum.replaceAll(",", ""); // 去掉所有的逗号 // 查找这样的串:连续split位数字的串,其左侧有个数字,其右侧不是数字 Pattern p = Pattern.compile( "(?〈=\\d)(\\d{"+split+"})(?!\\d)" ); for( Matcher m=p.matcher( retNum ); m.find(); ){ retNum = m.replaceFirst(",$1"); m = p.matcher( retNum ); return retNum;

现在,只剩下一个小小的遗憾,就是那个循环了。

不过,也可能Java中有从右向左查找的参数,只是我不知道而已,有谁知道的,请告诉我,不胜感谢!^_^⑤ 尽管Java看起来似乎不支持正则表达式的从右向左的查找和替换。

那么碰到这种情况,循环是不是就一定不可避免了呢。

其实,如果换个思路,我们自己把串给倒过来,就不需要那个循环了,用正则表达式一下子就搞定了。实现的代码如下:

public static String formatNumber5( String iniNum, int split ){ StringBuffer tmp = new StringBuffer().append( iniNum.replaceAll(",", "") ) .reverse(); // ① 去掉所有逗号,并把串倒过来。

// ② 替换这样的串:连续split位数字的串,其右边还有个数字,在串的右边添加逗号 String retNum = Pattern.compile( "(\\d{" + split + "})(?=\\d)" ) .matcher( tmp.toString() ).replaceAll("$1,"); // ③ 替换完后,再把串倒回去返回 return new StringBuffer().append( retNum ).reverse().toString();

哈哈,没有循环,三步搞定!⑥ 上面已经提到,javaScript也提供了对正则表达式的支持。

有点遗憾的是,javaScript中没有提供正则表达式的环视功能。

不过没关系,不用环视,我们一样可以实现给数字添加分隔符的。

下面给出javaScript的代码。( 可以参照比对④中的Java代码。)

〈html〉〈head〉function formatNumber6( num ){ if( !num.match(/^([0-9]|-)[0-9,]*$/) ){ // 数字或负号开头,后续数字或逗号的文字串 return num; // 数字不匹配 num = num.replace(/,/g,""); // 去掉所有的逗号 num += ","; // 末尾加一个逗号,作为下列正则表达式的替换的基准 for( var re = /(\d)(\d{3}\,)/; re.test( num ); ){ num = num.replace( re, "$1\,$2" ); return num.substring( 0, num.length-1 ); function startup(){ alert( formatNumber6("-1234567890,1234567890,1234567890") ); window.onload = startup; 〈/head〉〈/html〉

没有环视功能的时候,只能靠在串末人为地先加上一个逗号来实现了。还有一个小细节,在写Java函数的时候,我用了两个参数,第二个参数是用来确认是多少位进行分隔的。传3就3位一分隔,传4就4位一分隔,这样就更灵活了。也许会计专业人士经过训练后,已经适应了这种西方人喜欢的千位分隔符。不过我是不习惯的。我觉得,对中国人而言,更适合的应该是万位分隔符。

在javaScript中,正则表达式是用两条斜线中间加表达式内容来表示的,这点和Java不同。Java用的是双引号。结果因为这个的缘故,我就没办法传入分隔多少位的参数了,我试了很多次,但JavaScript不认,只能放弃了。有谁有办法的,也请告诉我,不胜感谢!^_^ 以上归纳了若干种给数字添加分隔符的办法,如果你在编程时碰到问题,希望本文能给你一些启发和帮助。当然,也许还有更多更好的办法,欢迎讨论,共同提高。

猜你喜欢

最新文章

热门文章