reykit 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
reykit/rnumber.py ADDED
@@ -0,0 +1,161 @@
1
+ # !/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ @Time : 2023-04-22 22:32:34
6
+ @Author : Rey
7
+ @Contact : reyxbo@163.com
8
+ @Explain : Number methods.
9
+ """
10
+
11
+
12
+ from typing import Any, Union
13
+
14
+ from .rexception import throw
15
+
16
+
17
+ __all__ = (
18
+ 'digits',
19
+ 'to_number',
20
+ 'number_ch'
21
+ )
22
+
23
+
24
+ def digits(number: Union[int, float]) -> tuple[int, int]:
25
+ """
26
+ Judge the number of integer digits and decimal digits.
27
+
28
+ Parameters
29
+ ----------
30
+ number : Number to judge.
31
+
32
+ Returns
33
+ -------
34
+ Integer digits and decimal digits.
35
+ """
36
+
37
+ # Handle parameter.
38
+ number_str = str(number)
39
+
40
+ # Get digits.
41
+ if '.' in number_str:
42
+ int_str, dec_str = number_str.split('.')
43
+ int_digits = len(int_str)
44
+ dec_digits = len(dec_str)
45
+ else:
46
+ int_digits = len(number_str)
47
+ dec_digits = 0
48
+
49
+ return int_digits, dec_digits
50
+
51
+
52
+ def to_number(
53
+ data: Any,
54
+ raising: bool = True
55
+ ) -> Any:
56
+ """
57
+ Convert data to number.
58
+
59
+ Parameters
60
+ ----------
61
+ data : Data.
62
+ raising : When parameter `string` value error, whether throw exception, otherwise return original value.
63
+
64
+ Returns
65
+ -------
66
+ Converted number.
67
+ """
68
+
69
+ # Convert.
70
+ try:
71
+ data = float(data)
72
+ except (ValueError, TypeError):
73
+
74
+ # Throw exception.
75
+ if raising:
76
+ throw(ValueError, data)
77
+
78
+ else:
79
+ if data % 1 == 0:
80
+ data = int(data)
81
+
82
+ return data
83
+
84
+
85
+ def number_ch(number: int) -> str:
86
+ """
87
+ Convert number to chinese number.
88
+
89
+ Parameters
90
+ ----------
91
+ number : Number to convert.
92
+
93
+ Returns
94
+ -------
95
+ Chinese number.
96
+ """
97
+
98
+ # Import.
99
+ from .rregex import sub_batch
100
+
101
+ # Set parameter.
102
+ map_digit = {
103
+ '0': '零',
104
+ '1': '一',
105
+ '2': '二',
106
+ '3': '三',
107
+ '4': '四',
108
+ '5': '五',
109
+ '6': '六',
110
+ '7': '七',
111
+ '8': '八',
112
+ '9': '九',
113
+ }
114
+ map_digits = {
115
+ 0: '',
116
+ 1: '十',
117
+ 2: '百',
118
+ 3: '千',
119
+ 4: '万',
120
+ 5: '十',
121
+ 6: '百',
122
+ 7: '千',
123
+ 8: '亿',
124
+ 9: '十',
125
+ 10: '百',
126
+ 11: '千',
127
+ 12: '万',
128
+ 13: '十',
129
+ 14: '百',
130
+ 15: '千',
131
+ 16: '兆'
132
+ }
133
+
134
+ # Handle parameter.
135
+ number_str = str(number)
136
+
137
+ # Replace digit.
138
+ for digit, digit_ch in map_digit.items():
139
+ number_str = number_str.replace(digit, digit_ch)
140
+
141
+ # Add digits.
142
+ number_list = []
143
+ for index, digit_ch in enumerate(number_str[::-1]):
144
+ digits_ch = map_digits[index]
145
+ number_list.insert(0, digits_ch)
146
+ number_list.insert(0, digit_ch)
147
+ number_str = ''.join(number_list)
148
+
149
+ # Delete redundant content.
150
+ number_str = sub_batch(
151
+ number_str,
152
+ ('(?<=零)[^万亿兆]', ''),
153
+ ('零+', '零'),
154
+ ('零(?=[万亿兆])', '')
155
+ )
156
+ if number_str.startswith('一十'):
157
+ number_str = number_str[1:]
158
+ if number_str.endswith('零'):
159
+ number_str = number_str[:-1]
160
+
161
+ return number_str