thunderer/numbase

将任意进制数转换为任意进制

v0.1.2 2017-01-14 16:10 UTC

This package is auto-updated.

Last update: 2024-08-29 04:42:50 UTC


README

Build License Version Psalm

轻松在任意进制和符号集中转换数字。

安装

此库在 Packagist 上可用,名称为 thunderer/numbase。它需要 PHP >=7.4 和 GMP 扩展来处理大数。对于较老的 PHP 版本,请使用 ^0.1 约束,它适用于 5.3 及以上版本。

使用方法

最简单的方式™

use Thunder\Numbase\Numbase;

$numbase = Numbase::createDefault();

// decimal 15 to hexadecimal number
assert('F' === $numbase->convert(15, 10, 16));
// 64000 decimal to base 32000
assert('20' === $numbase->convert(64000, 10, 32000));

常规使用(更多选项请参阅内部结构部分)

use Thunder\Numbase\Numbase;

$base62 = new Base62Symbols();
$numbase = new Numbase(new GmpConverter($base62), new StrictFormatter($base62));

// decimal 15 to hexadecimal number
assert('F' === $numbase->convert(15, 10, 16));

展示

在符号集中转换数字

$base10 = new Base10Symbols();
$upper = new StringSymbols('!@#$%^&*()');

$numbase = new Numbase(new GmpDigits($base10), new StrictFormatter($upper));

assert('#!' === $numbase->convert('20', 10, 10));
assert('-$!' === $numbase->convert('-30', 10, 10));

$numbase = new Numbase(new GmpDigits($upper), new StrictFormatter($base10));

assert('20' === $numbase->convert('#!', 10, 10));
assert('-30' === $numbase->convert('-$!', 10, 10));

获取数字值的数组(对于任何符号集都无法表示的基数)

$numbase = new Numbase(new GmpDigits(new Base62Symbols()), new ArrayFormatter());

// convert 10^12 to base 99:
assert(array('10', '61', '53', '3', '51', '60', '10') 
    === $numbase->convert('10000000000000', 10, 99));

内部结构

Numbase 构建在几个概念之上

  • 转换器,将数字转换为数字数组的数列
  • 格式化器,接收这些数组并返回最终数字
  • 符号,在转换器中用于检查符号值和在格式化器中获取数字符号

此库附带每个概念的几个实现,例如

  • 转换器
    • GmpConverter:可以将任何大于 2 的基数的整数进行转换,使用 gmp_*() 函数
    • GmpStrvalConverter:使用 gmp_strval() 在 2 到 62 之间进行转换
    • BaseConvertConverter:使用 base_convert() 在 2 到 32 之间进行转换
  • 格式化器
    • ArrayFormatter:返回原始的数字数组
    • StrictFormatter:返回数字字符串,如果符号集中找不到数字则抛出异常
    • FallbackFormatter:返回数字字符串,如果符号集中找不到数字则返回由配置的分隔符分隔的数字值字符串
  • 符号
    • ArraySymbols:接受关联数组 array(value => symbol)
    • Base62Symbols:包含用于 62 进制的符号集 0-9A-Za-z up
    • StringSymbols:接受字符串并将其分割成符号,将连续的值分配给每个字符

命名构造函数 Numbase::createDefault() 使用 GmpConverterStrictFormatterBase62Symbols 作为默认值。

许可协议

请参阅此库主目录下的 LICENSE 文件。