Function formatDecimal [src]

Write a FloatDecimal to a buffer in decimal form. The buffer provided must be greater than min_buffer_size bytes in length. If no precision is specified, this may still return an error. If precision is specified, 2 + precision bytes will always be written.

Prototype

pub fn formatDecimal(comptime T: type, buf: []u8, f_: FloatDecimal(T), precision: ?usize) FormatError![]const u8

Parameters

T: typebuf: []u8f_: FloatDecimal(T)precision: ?usize

Possible Errors

BufferTooSmall

Source

pub fn formatDecimal(comptime T: type, buf: []u8, f_: FloatDecimal(T), precision: ?usize) FormatError![]const u8 { std.debug.assert(buf.len >= min_buffer_size); var f = f_; if (f.exponent == special_exponent) { return copySpecialStr(buf, f); } if (precision) |prec| { f = round(T, f, .decimal, prec); } var output = f.mantissa; const olength = decimalLength(output); // fixed bound: leading_digit(1) + point(1) const req_bytes = if (f.exponent >= 0) @as(usize, 2) + @abs(f.exponent) + olength + (precision orelse 0) else @as(usize, 2) + @max(@abs(f.exponent) + olength, precision orelse 0); if (buf.len < req_bytes) { return error.BufferTooSmall; } // Step 5: Print the decimal representation var index: usize = 0; if (f.sign) { buf[index] = '-'; index += 1; } const dp_offset = f.exponent + cast_i32(olength); if (dp_offset <= 0) { // 0.000001234 buf[index] = '0'; buf[index + 1] = '.'; index += 2; const dp_index = index; const dp_poffset: u32 = @intCast(-dp_offset); @memset(buf[index..][0..dp_poffset], '0'); index += dp_poffset; writeDecimal(buf[index..], &output, olength); index += olength; if (precision) |prec| { const dp_written = index - dp_index; if (prec > dp_written) { @memset(buf[index..][0 .. prec - dp_written], '0'); } index = dp_index + prec - @intFromBool(prec == 0); } } else { // 123456000 const dp_uoffset: usize = @intCast(dp_offset); if (dp_uoffset >= olength) { writeDecimal(buf[index..], &output, olength); index += olength; @memset(buf[index..][0 .. dp_uoffset - olength], '0'); index += dp_uoffset - olength; if (precision) |prec| { if (prec != 0) { buf[index] = '.'; index += 1; @memset(buf[index..][0..prec], '0'); index += prec; } } } else { // 12345.6789 writeDecimal(buf[index + dp_uoffset + 1 ..], &output, olength - dp_uoffset); buf[index + dp_uoffset] = '.'; const dp_index = index + dp_uoffset + 1; writeDecimal(buf[index..], &output, dp_uoffset); index += olength + 1; if (precision) |prec| { const dp_written = olength - dp_uoffset; if (prec > dp_written) { @memset(buf[index..][0 .. prec - dp_written], '0'); } index = dp_index + prec - @intFromBool(prec == 0); } } } return buf[0..index]; }