/** * @license Apache-2.0 * * Copyright (c) 2022 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 'use strict'; // MODULES // var isNumber = require( './is_number.js' ); var zeroPad = require( './zero_pad.js' ); // NOTE: for the following, we explicitly avoid using stdlib packages in this particular package in order to avoid circular dependencies. var lowercase = String.prototype.toLowerCase; var uppercase = String.prototype.toUpperCase; // MAIN // /** * Formats a token object argument as an integer. * * @private * @param {Object} token - token object * @throws {Error} must provide a valid integer * @returns {string} formatted token argument */ function formatInteger( token ) { var base; var out; var i; switch ( token.specifier ) { case 'b': // Case: %b (binary) base = 2; break; case 'o': // Case: %o (octal) base = 8; break; case 'x': case 'X': // Case: %x, %X (hexadecimal) base = 16; break; case 'd': case 'i': case 'u': default: // Case: %d, %i, %u (decimal) base = 10; break; } out = token.arg; i = parseInt( out, 10 ); if ( !isFinite( i ) ) { // NOTE: We use the global `isFinite` function here instead of `@stdlib/math/base/assert/is-finite` in order to avoid circular dependencies. if ( !isNumber( out ) ) { throw new Error( 'invalid integer. Value: ' + out ); } i = 0; } if ( i < 0 && ( token.specifier === 'u' || base !== 10 ) ) { i = 0xffffffff + i + 1; } if ( i < 0 ) { out = ( -i ).toString( base ); if ( token.precision ) { out = zeroPad( out, token.precision, token.padRight ); } out = '-' + out; } else { out = i.toString( base ); if ( !i && !token.precision ) { out = ''; } else if ( token.precision ) { out = zeroPad( out, token.precision, token.padRight ); } if ( token.sign ) { out = token.sign + out; } } if ( base === 16 ) { if ( token.alternate ) { out = '0x' + out; } out = ( token.specifier === uppercase.call( token.specifier ) ) ? uppercase.call( out ) : lowercase.call( out ); } if ( base === 8 ) { if ( token.alternate && out.charAt( 0 ) !== '0' ) { out = '0' + out; } } return out; } // EXPORTS // module.exports = formatInteger;