【程序】Spads 出品字符串高效提取数值方法 Shane 末日圣诞奉献
2012-12-25 18:33
696 查看
Spads 出品,作者 WangXP 与 Shane
目录
---------- ---------- ---------- ----------
1 【综述】 http://shanelooli.blog.51cto.com/5523233/1100063
2 【程序】 http://shanelooli.blog.51cto.com/5523233/1100074
3 【功能】 http://shanelooli.blog.51cto.com/5523233/1100356
4 【性能】 测试程序 http://shanelooli.blog.51cto.com/5523233/1100417
_ 测试分析 http://shanelooli.blog.51cto.com/5523233/1100418
5 【附录】
因为篇幅原因,51CTO 只允许单篇 80000 个字符,所以本文将拆分成几个部分发布。
其中 5【附录】是针对 1【综述】内容的,所以放在了一起。
2 【程序】
---------- ---------- ---------- ----------
Spads 直接编写了适用的程序,经过很长时间性能优化,达到了优于上述所有方法的效果。代码如下。
经过测试,发现本方法可以完美地达到需要的处理效果。以下是测试报告。
本文还发表在我的其它技术日志
CSDN : http://blog.csdn.net/shanelooli/article/details/8432250
ITeye : http://surmounting.iteye.com/blog/1754323
中国开源社区: http://my.oschina.net/shane1984/blog/98088
目录
---------- ---------- ---------- ----------
1 【综述】 http://shanelooli.blog.51cto.com/5523233/1100063
2 【程序】 http://shanelooli.blog.51cto.com/5523233/1100074
3 【功能】 http://shanelooli.blog.51cto.com/5523233/1100356
4 【性能】 测试程序 http://shanelooli.blog.51cto.com/5523233/1100417
_ 测试分析 http://shanelooli.blog.51cto.com/5523233/1100418
5 【附录】
因为篇幅原因,51CTO 只允许单篇 80000 个字符,所以本文将拆分成几个部分发布。
其中 5【附录】是针对 1【综述】内容的,所以放在了一起。
2 【程序】
---------- ---------- ---------- ----------
Spads 直接编写了适用的程序,经过很长时间性能优化,达到了优于上述所有方法的效果。代码如下。
/** * <b>抽取字符串的数字值</b><br/> * * 本方法用来将传入字符串的内容理解为十进制数值。如果传入字符串的内容无法理解为 * 数值,则返回 <code>null</code> 。数值字符串是指包括正、负的整数、浮点数;其中 * 允许出现分割用空格,允许直接使用小数点起头以表示 0.x 样的小数。<br/> * 方法使用示例如下。 * <pre> * StringTool.fetchNumberValue("15") = 15 (java.lang.Integer) * StringTool.fetchNumberValue("300 1500 1010") * = 30015001010 (java.lang.Long) * StringTool.fetchNumberValue(" 28 ") = 28 (java.lang.Integer) * StringTool.fetchNumberValue("3.8") = 3.8 (java.lang.Double) * StringTool.fetchNumberValue("-99") = -99 (java.lang.Integer) * StringTool.fetchNumberValue("+15") = null * StringTool.fetchNumberValue(".45") = 0.45 (java.lang.Double) * StringTool.fetchNumberValue("-.1") = -0.1 (java.lang.Double) * StringTool.fetchNumberValue("0x3AFF0") = null * StringTool.fetchNumberValue("042") = 42 (java.lang.Integer) * StringTool.fetchNumberValue("Spads") = null * StringTool.fetchNumberValue("") = null * StringTool.fetchNumberValue(null) = null * StringTool.fetchNumberValue("5 - 3") = null * StringTool.fetchNumberValue("3.1415926.5358") = null * StringTool.fetchNumberValue("13205972138597109830758190748937102794") * = 1.320597213859711E37 (java.lang.Double) * </pre> * * 本方法不涉及正则表达式,同时未避免生成异常的巨大系统消耗,通过遍历字符串每 * 一个字符来判断其是否符合十进制数值格式,格式不符则直接返回 * <code>null</code> 。如果格式符合,浮点数按 {@link Double} 识别,整数按 * {@link Long} 识别。如果数值范围符合 {@link Integer} ,则转换。 * * @see StringTool#removeChar(String, char) * @param numStr 准备提取数值的字符串 * @return 传入字符串按十进制理解的数值对象,其类型有可能为 * <code>Long</code> 、 <code>Integer</code> 或者 <code>Double</code>。 * @exception NumberFormatException 当字符串是整数但超过了 * {@link Long#MIN_VALUE} - {@link Long#MAX_VALUE} 范围同时其位数并不大于 20, * 或者字符串是浮点数 但超过了 * {@link Double#MIN_VALUE} - {@link Double#MAX_VALUE} 范围。 */ static public Number parseNumber(String numStr) { if (numStr == null || (numStr = numStr.trim()).length() == 0) return null; final StringBuilder numBuilder = new StringBuilder(); boolean doubleFlag = false; final int length = numStr.length(); char numChar; for (int index = 0; index != length; index++) { numChar = numStr.charAt(index); if (numChar > 57) return null; switch (StringTool.charType[numChar]) { // 在之前没有小数点的情况下出现小数点,记录,同时认为此字符串是浮点数 case 3: if (doubleFlag || index == length - 1) return null; doubleFlag = true; // 此处通过 // 如果是数字,认为此字符串还是数值,检查下一个字符 case 4: numBuilder.append(numChar); // 此处通过 // 如果是空格,直接检查下一个字符 case 1: continue; // 如果是负号,又不是首位,则按非数值字符串进行返回 case 2: if (index == 0) { numBuilder.append(numChar); continue; } // 此处通过 // 如果字符不符合数值格式,方法按非数值字符串进行返回 case 0: return null; } } if (doubleFlag || length > 20) return Double.valueOf(numBuilder.toString()); // 非浮点数情况,如果数值在整数范围内,则按整数返回。否则按长整数返回。 final long num = Long.parseLong(numBuilder.toString()); final int finalNum = (int) num; if (finalNum != num) return num; return finalNum; } /** * <b>字符类型数组</b><br/> * 为字符串抽取数值含义提供的字符类型获取器。通过将字符本身作为此数组下标获取对应 * 类型。类型用整数表示,含义如下。<br/> * 1 为空白间隔,对应 <code>' '</code> 和 <code>'\t'</code><br/> * 2 为负号,对应 <code>'-'</code><br/> * 3 为小数点,对应 <code>'.'</code><br/> * 4 为数字,对应 <code>'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'</code> */ static private int[] charType = { 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 2,3,0,4,4, 4,4,4,4,4, 4,4,4 };
经过测试,发现本方法可以完美地达到需要的处理效果。以下是测试报告。
Function test... ---------- ---------- ---------- ---------- String: 15 In StringTool way, get: 15 (Integer) ---------- ---------- ---------- ---------- String: 28 In StringTool way, get: 28 (Integer) ---------- ---------- ---------- ---------- String: 3.8 In StringTool way, get: 3.8 (Double) ---------- ---------- ---------- ---------- String: -99 In StringTool way, get: -99 (Integer) ---------- ---------- ---------- ---------- String: .45 In StringTool way, get: 0.45 (Double) ---------- ---------- ---------- ---------- String: -.1 In StringTool way, get: -0.1 (Double) ---------- ---------- ---------- ---------- String: null In StringTool way, get: null (null) ---------- ---------- ---------- ---------- String: 0x3AFF0 In StringTool way, get: null (null) ---------- ---------- ---------- ---------- String: 042 In StringTool way, get: 42 (Integer) ---------- ---------- ---------- ---------- String: Spads In StringTool way, get: null (null) ---------- ---------- ---------- ---------- String: In StringTool way, get: null (null) ---------- ---------- ---------- ---------- String: In StringTool way, get: null (null) ---------- ---------- ---------- ---------- String: 5 - 3 In StringTool way, get: null (null) ---------- ---------- ---------- ---------- String: 三十八 In StringTool way, get: null (null) ---------- ---------- ---------- ---------- String: 3.1415926.5358 In StringTool way, get: null (null) ---------- ---------- ---------- ---------- String: 39501.50 In StringTool way, get: 39501.5 (Double) ---------- ---------- ---------- ---------- String: 0.000385427 In StringTool way, get: 3.85427E-4 (Double) ---------- ---------- ---------- ---------- String: .33796678 In StringTool way, get: 0.33796678 (Double) ---------- ---------- ---------- ---------- String: 300011110000 In StringTool way, get: 300011110000 (Long) ---------- ---------- ---------- ---------- String: 300 1500 1010 In StringTool way, get: 30015001010 (Long) ---------- ---------- ---------- ---------- String: -570 0015 6726 In StringTool way, get: -57000156726 (Long) ---------- ---------- ---------- ---------- String: -2378957832975 In StringTool way, get: -2378957832975 (Long) ---------- ---------- ---------- ---------- String: 1370 0000 In StringTool way, get: 13700000 (Integer) ---------- ---------- ---------- ---------- String: 2015773 In StringTool way, get: 2015773 (Integer) ---------- ---------- ---------- ---------- String: 3850 In StringTool way, get: 3850 (Integer) ---------- ---------- ---------- ---------- String: -80058 In StringTool way, get: -80058 (Integer) ---------- ---------- ---------- ---------- String: -1 2853 2781 In StringTool way, get: -128532781 (Integer) ---------- ---------- ---------- ---------- String: 3 In StringTool way, get: 3 (Integer) ---------- ---------- ---------- ---------- String: 0 In StringTool way, get: 0 (Integer) ---------- ---------- ---------- ---------- String: -597213859710830758190748937102794 In StringTool way, get: -5.972138597108308E32 (Double) ---------- ---------- ---------- ---------- String: 78 9254 3253 2452 9572 8532 In StringTool way, get: 7.892543253245296E21 (Double) ---------- ---------- ---------- ---------- String: 13205972138597109830758190748937102794 In StringTool way, get: 1.320597213859711E37 (Double) ---------- ---------- ---------- ----------
本文还发表在我的其它技术日志
CSDN : http://blog.csdn.net/shanelooli/article/details/8432250
ITeye : http://surmounting.iteye.com/blog/1754323
中国开源社区: http://my.oschina.net/shane1984/blog/98088
相关文章推荐
- Spads 出品字符串高效提取数值方法 Shane 末日圣诞奉献
- 【性能】甲 Spads 出品字符串高效提取数值方法 Shane 末日圣诞奉献 推荐
- 【性能】乙 Spads 出品字符串高效提取数值方法 Shane 末日圣诞奉献
- Spads 出品字符串高效提取数值方法 Shane 末日圣诞奉献
- 【综述】Spads 出品字符串高效提取数值方法 Shane 末日圣诞奉献 推荐
- 【功能】Spads 出品字符串高效提取数值方法 Shane 末日圣诞奉献
- 分析字符串替换的高效方法
- Java 程序优化:字符串操作、基本运算方法等优化策略
- Linux Shell 解析java程序返回的Json字符串的方法
- 字符串的正则方法 数值的扩展
- 小程序json字符串转 json对象的方法
- 数值方法 回代程序(matlab)
- C++数值--字符串间转换方法总结
- 将任意字符串中的汉字提取出来的方法
- python之自练小程序(字符串方法)
- Javascript从字符串过滤出数值的方法
- 【转】VB程序字符串查找方法(组图)
- 提取Windows中自解压文件和安装程序的方法
- C#中字符串的格式化及转换成数值的方法
- 安卓教程:提取APK程序里图片资源的方法