| ... | @@ -364,6 +364,26 @@ fn formatIntCallback(context: &FormatIntBuf, bytes: []const u8) -> bool { | ... | @@ -364,6 +364,26 @@ fn formatIntCallback(context: &FormatIntBuf, bytes: []const u8) -> bool { |
| 364 | return true; | 364 | return true; |
| 365 | } | 365 | } |
| 366 | | 366 | |
| | 367 | pub fn parseInt(comptime T: type, buf: []const u8, radix: u8) -> %T { |
| | 368 | if (!T.is_signed) |
| | 369 | return parseUnsigned(T, buf, radix); |
| | 370 | if (buf.len == 0) |
| | 371 | return T(0); |
| | 372 | if (buf[0] == '-') { |
| | 373 | return math.negate(%return parseUnsigned(T, buf[1..], radix)); |
| | 374 | } else if (buf[0] == '+') { |
| | 375 | return parseUnsigned(T, buf[1..], radix); |
| | 376 | } else { |
| | 377 | return parseUnsigned(T, buf, radix); |
| | 378 | } |
| | 379 | } |
| | 380 | |
| | 381 | test "fmt.parseInt" { |
| | 382 | assert(%%parseInt(i32, "-10", 10) == -10); |
| | 383 | assert(%%parseInt(i32, "+10", 10) == 10); |
| | 384 | assert(if (parseInt(i32, " 10", 10)) |_| false else |err| err == error.InvalidChar); |
| | 385 | } |
| | 386 | |
| 367 | pub fn parseUnsigned(comptime T: type, buf: []const u8, radix: u8) -> %T { | 387 | pub fn parseUnsigned(comptime T: type, buf: []const u8, radix: u8) -> %T { |
| 368 | var x: T = 0; | 388 | var x: T = 0; |
| 369 | | 389 | |