Automattic\WooCommerce\Internal\Admin\Settings
SettingsUISchema::canonicalize_number
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() 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;
}