NumberTools.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:4k
源码类别:

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2004 The Apache Software Foundation
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  * 
  8.  * http://www.apache.org/licenses/LICENSE-2.0
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. using System;
  17. namespace Lucene.Net.Documents
  18. {
  19. /// <summary> Provides support for converting longs to Strings, and back again. The strings
  20. /// are structured so that lexicographic sorting order is preserved.
  21. /// 
  22. /// <p>
  23. /// That is, if l1 is less than l2 for any two longs l1 and l2, then
  24. /// NumberTools.longToString(l1) is lexicographically less than
  25. /// NumberTools.longToString(l2). (Similarly for "greater than" and "equals".)
  26. /// 
  27. /// <p>
  28. /// This class handles <b>all</b> long values (unlike
  29. /// {@link Lucene.Net.document.DateField}).
  30. /// 
  31. /// </summary>
  32. /// <author>  Matt Quail (spud at madbean dot com)
  33. /// </author>
  34. public class NumberTools
  35. {
  36. private const int RADIX = 36;
  37. private const char NEGATIVE_PREFIX = '-';
  38. // NB: NEGATIVE_PREFIX must be < POSITIVE_PREFIX
  39. private const char POSITIVE_PREFIX = '0';
  40. //NB: this must be less than
  41. /// <summary> Equivalent to longToString(Long.MIN_VALUE)</summary>
  42. public static readonly System.String MIN_STRING_VALUE = NEGATIVE_PREFIX + "0000000000000";
  43. /// <summary> Equivalent to longToString(Long.MAX_VALUE)</summary>
  44. public static readonly System.String MAX_STRING_VALUE = POSITIVE_PREFIX + "1y2p0ij32e8e7";
  45. /// <summary> The length of (all) strings returned by {@link #longToString}</summary>
  46. public static readonly int STR_SIZE = MIN_STRING_VALUE.Length;
  47. /// <summary> Converts a long to a String suitable for indexing.</summary>
  48. public static System.String LongToString(long l)
  49. {
  50. if (l == System.Int64.MinValue)
  51. {
  52. // special case, because long is not symetric around zero
  53. return MIN_STRING_VALUE;
  54. }
  55. System.Text.StringBuilder buf = new System.Text.StringBuilder(STR_SIZE);
  56. if (l < 0)
  57. {
  58. buf.Append(NEGATIVE_PREFIX);
  59. l = System.Int64.MaxValue + l + 1;
  60. }
  61. else
  62. {
  63. buf.Append(POSITIVE_PREFIX);
  64. }
  65. System.String num = System.Convert.ToString(l, RADIX);
  66. int padLen = STR_SIZE - num.Length - buf.Length;
  67. while (padLen-- > 0)
  68. {
  69. buf.Append('0');
  70. }
  71. buf.Append(num);
  72. return buf.ToString();
  73. }
  74. /// <summary> Converts a String that was returned by {@link #longToString} back to a
  75. /// long.
  76. /// 
  77. /// </summary>
  78. /// <throws>  IllegalArgumentException </throws>
  79. /// <summary>             if the input is null
  80. /// </summary>
  81. /// <throws>  NumberFormatException </throws>
  82. /// <summary>             if the input does not parse (it was not a String returned by
  83. /// longToString()).
  84. /// </summary>
  85. public static long StringToLong(System.String str)
  86. {
  87. if (str == null)
  88. {
  89. throw new System.NullReferenceException("string cannot be null");
  90. }
  91. if (str.Length != STR_SIZE)
  92. {
  93. throw new System.FormatException("string is the wrong size");
  94. }
  95. if (str.Equals(MIN_STRING_VALUE))
  96. {
  97. return System.Int64.MinValue;
  98. }
  99. char prefix = str[0];
  100. long l = System.Convert.ToInt64(str.Substring(1), RADIX);
  101. if (prefix == POSITIVE_PREFIX)
  102. {
  103. // nop
  104. }
  105. else if (prefix == NEGATIVE_PREFIX)
  106. {
  107. l = l - System.Int64.MaxValue - 1;
  108. }
  109. else
  110. {
  111. throw new System.FormatException("string does not begin with the correct prefix");
  112. }
  113. return l;
  114. }
  115. }
  116. }