我试图弄清楚如何使基本转换(base 36)使用 0 作为第一个字符。
我想使用一种方案来表示正整数,其中1
表示为0
,10
表示为9
,11
表示为a
,等等,其中前导零很重要。
所以convert(36)
应该给我z
,然后convert(37)
应该给我00
。
我认为这种格式与 base 36 足够相似,我应该能够使用base_convert来做到这一点,但我无法弄清楚如何。
我试图弄清楚如何使基本转换(base 36)使用 0 作为第一个字符。
我想使用一种方案来表示正整数,其中1
表示为0
,10
表示为9
,11
表示为a
,等等,其中前导零很重要。
所以convert(36)
应该给我z
,然后convert(37)
应该给我00
。
我认为这种格式与 base 36 足够相似,我应该能够使用base_convert来做到这一点,但我无法弄清楚如何。
这是一个以您想要的方式进行转换的函数。它可能会更有效地完成,但至少可以完成它:
function base_convert_0($number, $from_base, $to_base){
$numeric = base_convert($number, $from_base, 10);
$result = '';
while($numeric > $to_base){
$result = base_convert(($numeric - 1) % $to_base, 10, 36) . $result;
$numeric = floor(($numeric - 1)/$to_base);
}
$result = base_convert(($numeric - 1), 10, 36) . $result;
return $result;
}
此处显示 80 行 ( base_convert_0($i, 10, 36)
):
1: 0
2: 1
3: 2
4: 3
5: 4
6: 5
7: 6
8: 7
9: 8
10: 9
11: a
12: b
13: c
14: d
15: e
16: f
17: g
18: h
19: i
20: j
21: k
22: l
23: m
24: n
25: o
26: p
27: q
28: r
29: s
30: t
31: u
32: v
33: w
34: x
35: y
36: z
37: 00
38: 01
39: 02
40: 03
41: 04
42: 05
43: 06
44: 07
45: 08
46: 09
47: 0a
48: 0b
49: 0c
50: 0d
51: 0e
52: 0f
53: 0g
54: 0h
55: 0i
56: 0j
57: 0k
58: 0l
59: 0m
60: 0n
61: 0o
62: 0p
63: 0q
64: 0r
65: 0s
66: 0t
67: 0u
68: 0v
69: 0w
70: 0x
71: 0y
72: 0z
73: 10
74: 11
75: 12
76: 13
77: 14
78: 15
79: 16
80: 17
我不确定你是否需要扭转这一点,但无论如何这很容易:
function base_convert_un0($number, $from_base, $to_base){
$as_string = strval($number);
for($result = $j = 0, $i = strlen($as_string); $i--; $j++)
$result += (base_convert($as_string{$i}, $from_base, 10) + 1)*pow($from_base, $j);
return base_convert($result, 10, $to_base);
}
我不太了解您转换的意义,但是您不只是尝试转换n-1吗?
base_convert ($number_to_convert - 1, 10, 36);
编辑:如果 1 base 10转换为 0你的特殊基础- 你将使用什么字符作为 0?我认为您的系统不能用于有效的数字符号。
EDIT2:我可能以过于数学的方式理解了这个问题。请参阅@Paulpro 的答案以获取该问题的实用解决方案(实际上并不是转换为另一个基数,而是返回一个表示输入数字的字符串)。