Automattic\WooCommerce\Internal\Admin\Settings

SettingsUISchema::canonicalize_number │ private static │ WC 1.0

Canonicalize a number without first rounding integral strings.

Method of the class: SettingsUISchema{}

No Hooks.

Returns

int|float|null.

Usage

$result = SettingsUISchema::canonicalize_number( $value, $integer_only, $field_id, $property );
$value(mixed) (required)
Candidate value.
$integer_only(true|false) (required)
Whether the result must be an integer.
$field_id(string) (required)
Field id.
$property(string) (required)
Value or bound name.

SettingsUISchema::canonicalize_number() code WC 11.2.1

private static function canonicalize_number( $value, bool $integer_only, string $field_id, string $property ) {
	if ( null === $value || ( is_string( $value ) && '' === trim( $value ) ) ) {
		return null;
	}

	if ( is_int( $value ) ) {
		self::assert_safe_integer( (string) $value, $field_id, $property );
		return $value;
	}

	if ( is_float( $value ) ) {
		if ( ! is_finite( $value ) ) {
			throw self::invalid_schema( sprintf( 'Field "%1$s" %2$s must be a finite number.', $field_id, $property ) );
		}

		if ( floor( $value ) === $value ) {
			$integral = sprintf( '%.0f', $value );
			self::assert_safe_integer( $integral, $field_id, $property );
			return $integer_only ? (int) $integral : $value;
		}

		if ( $integer_only ) {
			throw self::invalid_schema( sprintf( 'Field "%1$s" %2$s must be an integer.', $field_id, $property ) );
		}

		return $value;
	}

	$integral = self::get_integral_decimal( $value );
	if ( null !== $integral ) {
		self::assert_safe_integer( $integral, $field_id, $property );

		return (int) $integral;
	}

	if ( $integer_only ) {
		throw self::invalid_schema( sprintf( 'Field "%1$s" %2$s must be an integer.', $field_id, $property ) );
	}

	if ( ! is_string( $value ) || ! self::is_decimal_number( trim( $value ) ) ) {
		throw self::invalid_schema( sprintf( 'Field "%1$s" %2$s must be a finite number.', $field_id, $property ) );
	}

	$number         = (float) trim( $value );
	$encoded_number = wp_json_encode( $number, JSON_PRESERVE_ZERO_FRACTION );
	if (
		! is_finite( $number ) ||
		( 0.0 === $number && ! self::decimal_string_is_zero( trim( $value ) ) ) ||
		! is_string( $encoded_number ) ||
		! self::decimal_strings_represent_same_value( trim( $value ), $encoded_number )
	) {
		throw self::invalid_schema( sprintf( 'Field "%1$s" %2$s cannot be represented as a finite number without loss.', $field_id, $property ) );
	}

	return $number;
}