/locales/en_us.d

http://github.com/wilkie/djehuty · D · 197 lines · 162 code · 30 blank · 5 comment · 27 complexity · 3511a713476d170e0537b4271e0db4da MD5 · raw file

  1. module locales.en_us;
  2. import core.locale;
  3. import core.time;
  4. import core.date;
  5. import core.definitions;
  6. import core.string;
  7. class LocaleEnglish_US : LocaleInterface {
  8. string formatTime(Time time) {
  9. long hour = time.hours;
  10. bool pm = false;
  11. if (hour >= 12) {
  12. hour -= 12;
  13. pm = true;
  14. }
  15. string ret;
  16. ret = toStr(hour);
  17. ret ~= ":";
  18. long min = time.minutes % 60;
  19. if (min < 10) {
  20. ret ~= "0";
  21. }
  22. ret ~= toStr(min);
  23. ret ~= ":";
  24. long sec = time.seconds % 60;
  25. if (sec < 10) {
  26. ret ~= "0";
  27. }
  28. ret ~= toStr(sec);
  29. if (pm) {
  30. ret ~= "pm";
  31. }
  32. else {
  33. ret ~= "PM";
  34. }
  35. return ret;
  36. }
  37. string formatDate(Date date) {
  38. string ret;
  39. switch(date.month) {
  40. case Month.January:
  41. ret = "January ";
  42. break;
  43. case Month.February:
  44. ret = "February ";
  45. break;
  46. case Month.March:
  47. ret = "March ";
  48. break;
  49. case Month.April:
  50. ret = "April ";
  51. break;
  52. case Month.May:
  53. ret = "May ";
  54. break;
  55. case Month.June:
  56. ret = "June ";
  57. break;
  58. case Month.July:
  59. ret = "July ";
  60. break;
  61. case Month.August:
  62. ret = "August ";
  63. break;
  64. case Month.September:
  65. ret = "September ";
  66. break;
  67. case Month.October:
  68. ret = "October ";
  69. break;
  70. case Month.November:
  71. ret = "November ";
  72. break;
  73. case Month.December:
  74. ret = "December ";
  75. break;
  76. default:
  77. ret = "??? ";
  78. break;
  79. }
  80. string day = toStr(date.day);
  81. ret ~= day;
  82. ret ~= ", " ~ toStr(date.year);
  83. return ret;
  84. }
  85. string formatCurrency(long whole, long scale) {
  86. return "$" ~ formatNumber(whole, scale, 2);
  87. }
  88. string formatCurrency(double amount) {
  89. return "$" ~ formatNumber(amount);
  90. }
  91. string formatNumber(long whole, long scale, long round = -1) {
  92. long intPart;
  93. long baseScale;
  94. long fracPart;
  95. // Get integer part of decimal
  96. intPart = whole;
  97. baseScale = 1;
  98. int precision;
  99. for (long i; i < scale; i++) {
  100. intPart /= 10;
  101. baseScale *= 10;
  102. precision++;
  103. }
  104. // Get fraction as an integer
  105. fracPart = whole % baseScale;
  106. // Round down
  107. for ( ; precision > round ; precision-- ) {
  108. fracPart /= 10;
  109. }
  110. return formatNumber(intPart) ~ "." ~ formatNumber(fracPart);
  111. }
  112. string formatNumber(long value) {
  113. if (value == 0) {
  114. return "0";
  115. }
  116. string ret;
  117. while (value > 0) {
  118. long part = value % 1000;
  119. value /= 1000;
  120. if (ret !is null) {
  121. ret = toStr(part) ~ "," ~ ret;
  122. }
  123. else {
  124. ret = toStr(part);
  125. }
  126. }
  127. return ret;
  128. }
  129. string formatNumber(double value) {
  130. string ret;
  131. long intPart = cast(long)value;
  132. while (intPart > 0) {
  133. long part = intPart % 1000;
  134. intPart /= 1000;
  135. if (ret !is null) {
  136. ret = toStr(part) ~ "," ~ ret;
  137. }
  138. else {
  139. ret = toStr(part);
  140. }
  141. }
  142. ret ~= ".";
  143. ret ~= toStr(value);
  144. // round last digit
  145. bool roundUp = (ret[$-1] >= '5');
  146. ret = ret[0..$-1];
  147. while (roundUp) {
  148. if (ret.length == 0) {
  149. return "0";
  150. }
  151. else if (ret[$-1] == '.' || ret[$-1] == '9') {
  152. ret = ret[0..$-1];
  153. continue;
  154. }
  155. ret[$-1]++;
  156. break;
  157. }
  158. // get rid of useless zeroes (and point if necessary)
  159. foreach_reverse(uint i, chr; ret) {
  160. if (chr != '0' && chr != '.') {
  161. ret = ret[0..i+1];
  162. break;
  163. }
  164. }
  165. return ret;
  166. }
  167. }