| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

Java 数値文字列の桁数チェック(指数表現にも対応)

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

Java 数値文字列の桁数チェック(指数表現にも対応)

Java |

  1. /**
  2. * 数値の文字列表現の桁数が妥当かどうかチェック
  3. * (浮動小数点数の指数表現にも対応)
  4. *
  5. * @param value 数値の文字列表現
  6. * @param precision 全体桁数
  7. * @param scale 小数部桁数
  8. * @return 妥当な場合true
  9. */
  10. public boolean validateNumberStringScale (
  11. String value,
  12. int precision,
  13. int scale) {
  14. if ( value == null || "".equals(value.trim())) {
  15. return false;
  16. } else {
  17. // 整数部桁数
  18. intPart = precision - scale;
  19. String exper = "^[0-9]{0," + intPart + "}([\\\\.][0-9]{0," + scale + "}){0,1}$";
  20. if (!value.matches(exper)) {
  21. boolean isFloatCheckOk = false;
  22. try {
  23. /* *********************
  24. * 浮動小数点数の指数表現の場合
  25. * (仮数部)×(基数)(指数部)
  26. *
  27. * 例 0.000001
  28. * .net : 1E-06
  29. * java : 1.0E-6
  30. *
  31. * 例 1000000000000000000.000000
  32. * .net : 1E18
  33. * java : 1.0E18
  34. * *********************/
  35. if (value.matches("-{0,1}[0-9]+\\.{0,1}[0-9]*[eE]-{0,1}[0-9]+")) {
  36. String[] parts = value.split("[eE]");
  37. //System.out.println(String.format("%f" ,Double.parseDouble(value)));
  38. // 仮数部
  39. double significand = Double.parseDouble(parts[0]);
  40. // 基数
  41. int fundamental = Integer.parseInt(parts[1]);
  42. // 仮数部 桁
  43. int significandLen = (int)Math.log10(significand) + 1;
  44. int pos = fundamental + significandLen;
  45. if (pos == 0) {
  46. if (scale >= 1 && intPart >=1) {
  47. isFloatCheckOk = true;
  48. }
  49. } else if
  50. (pos < 0) {
  51. if (scale >= 1 && intPart >= Math.abs(pos)) {
  52. isFloatCheckOk = true;
  53. }
  54. } else if
  55. (pos > 0) {
  56. if (scale >= Math.abs(pos) && intPart >=1) {
  57. isFloatCheckOk = true;
  58. }
  59. }
  60. }
  61. }catch(Exception e){
  62. isFloatCheckOk = false;
  63. }
  64. if (!isFloatCheckOk) {
  65. return false;
  66. }
  67. }
  68. }
  69. return true;
  70. }