Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(359)

Side by Side Diff: runtime/lib/double.dart

Issue 8728006: Implement Double.toStringAsFixed. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix syntax error. Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/lib/double.cc ('k') | runtime/vm/bootstrap_natives.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 class Double implements double { 5 class Double implements double {
6 factory Double.fromInteger(int value) 6 factory Double.fromInteger(int value)
7 native "Double_doubleFromInteger"; 7 native "Double_doubleFromInteger";
8 int hashCode() { 8 int hashCode() {
9 try { 9 try {
10 return toInt(); 10 return toInt();
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 } 101 }
102 102
103 double round() native "Double_round"; 103 double round() native "Double_round";
104 double floor() native "Double_floor"; 104 double floor() native "Double_floor";
105 double ceil () native "Double_ceil"; 105 double ceil () native "Double_ceil";
106 double truncate() native "Double_truncate"; 106 double truncate() native "Double_truncate";
107 int toInt() native "Double_toInt"; 107 int toInt() native "Double_toInt";
108 double toDouble() { return this; } 108 double toDouble() { return this; }
109 109
110 double pow(num exponent) { 110 double pow(num exponent) {
111 return pow_(exponent.toDouble()); 111 return _pow(exponent.toDouble());
112 } 112 }
113 double pow_(double exponent) native "Double_pow"; 113 double _pow(double exponent) native "Double_pow";
114 114
115 String toStringAsFixed(int fractionDigits) { 115 String toStringAsFixed(int fractionDigits) {
116 // See ECMAScript-262, 15.7.4.5 for details. 116 // See ECMAScript-262, 15.7.4.5 for details.
117 117
118 // Step 2. 118 // Step 2.
119 if (fractionDigits < 0 || fractionDigits > 20) { 119 if (fractionDigits < 0 || fractionDigits > 20) {
120 // TODO(antonm): should be proper RangeError or Dart counterpart. 120 // TODO(antonm): should be proper RangeError or Dart counterpart.
121 throw "Range error"; 121 throw "Range error";
122 } 122 }
123 123
124 // Step 3. 124 // Step 3.
125 double x = this; 125 double x = this;
126 126
127 // Step 4. 127 // Step 4.
128 if (x.isNaN()) { 128 if (isNaN()) return "NaN";
129 return "NaN"; 129
130 // Step 5 and 6 skipped. Will be dealt with by native function.
131
132 // Step 7.
133 if (x >= 1e21 || x <= -1e21) {
134 return x.toString();
130 } 135 }
131 136
132 // Step 5. 137 return _toStringAsFixed(fractionDigits);
133 String s = ""; 138 }
139 String _toStringAsFixed(int fractionDigits) native "Double_toStringAsFixed";
134 140
135 // Step 6. 141 String toStringAsExponential(int fractionDigits) {
136 if (x.isNegative() && x != 0.0) { 142 // See ECMAScript-262, 15.7.4.6 for details.
137 s = "-"; 143
138 x = -x; 144 // The EcmaScript specification checks for NaN and Infinity before looking
145 // at the fractionDigits. In Dart we are consistent with toStringAsFixed and
146 // look at the fractionDigits first.
147
148 // Step 7.
149 if (fractionDigits < 0 || fractionDigits > 20) {
150 // TODO(antonm): should be proper RangeError or Dart counterpart.
151 throw "Range error";
139 } 152 }
140 153
141 // Step 7. 154 return _toStringAsExponential(fractionDigits);
142 String m; 155 }
143 if (x > 10e21) { 156 String _toStringAsExponential(int fractionDigits)
144 m = x.toString(); 157 native "Double_toStringAsExponential";
145 } else {
146 // Step 8.
147 158
148 // Step 8.a. 159 String toStringAsPrecision(int precision) {
149 // This is an approximation for n from the standard. 160 // See ECMAScript-262, 15.7.4.7 for details.
150 int n = (x * (10.0).pow(fractionDigits)).round().toInt();
151 161
152 // Step 8.b. 162 // The EcmaScript specification checks for NaN and Infinity before looking
153 m = n.toString(); 163 // at the fractionDigits. In Dart we are consistent with toStringAsFixed and
164 // look at the fractionDigits first.
154 165
155 // Step 8.c. 166 // Step 8.
156 if (fractionDigits != 0) { 167 if (precision < 1 || precision > 21) {
157 // Step 8.c.i. 168 // TODO(antonm): should be proper RangeError or Dart counterpart.
158 int k = m.length; 169 throw "Range error";
159 // Step 8.c.ii.
160 if (k <= fractionDigits) {
161 StringBuffer sb = new StringBuffer();
162 for (int i = 0; i < fractionDigits + 1 - k; i++) {
163 sb.add("0");
164 }
165 String z = sb.toString();
166 m = z + m;
167 k = fractionDigits + 1;
168 }
169 // Step 8.c.iii.
170 String a = m.substring(0, k - fractionDigits);
171 String b = m.substring(k - fractionDigits);
172 // Step 8.c.iv.
173 m = a + "." + b;
174 }
175 } 170 }
176 171
177 // Step 9. 172 return _toStringAsPrecision(precision);
178 return s + m;
179 } 173 }
180 String toStringAsExponential(int fractionDigits) { 174 String _toStringAsPrecision(int fractionDigits)
181 throw "Double.toStringAsExponential unimplemented."; 175 native "Double_toStringAsPrecision";
182 } 176
183 String toStringAsPrecision(int precision) {
184 throw "Double.toStringAsPrecision unimplemented.";
185 }
186 String toRadixString(int radix) { 177 String toRadixString(int radix) {
187 throw "Double.toRadixString unimplemented."; 178 throw "Double.toRadixString unimplemented.";
188 } 179 }
189 180
190 // Order is: NaN > Infinity > ... > 0.0 > -0.0 > ... > -Infinity. 181 // Order is: NaN > Infinity > ... > 0.0 > -0.0 > ... > -Infinity.
191 int compareTo(Comparable other) { 182 int compareTo(Comparable other) {
192 final int EQUAL = 0, LESS = -1, GREATER = 1; 183 final int EQUAL = 0, LESS = -1, GREATER = 1;
193 if (this < other) { 184 if (this < other) {
194 return LESS; 185 return LESS;
195 } else if (this > other) { 186 } else if (this > other) {
(...skipping 10 matching lines...) Expand all
206 return EQUAL; 197 return EQUAL;
207 } 198 }
208 } else if (isNaN()) { 199 } else if (isNaN()) {
209 return other.isNaN() ? EQUAL : GREATER; 200 return other.isNaN() ? EQUAL : GREATER;
210 } else { 201 } else {
211 // Other is NaN. 202 // Other is NaN.
212 return LESS; 203 return LESS;
213 } 204 }
214 } 205 }
215 } 206 }
OLDNEW
« no previous file with comments | « runtime/lib/double.cc ('k') | runtime/vm/bootstrap_natives.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698