from nicegui import ui
base_colors = {
2: 'text-blue-600',
8: 'text-green-600',
10: 'text-red-600',
16: 'text-purple-600'
}
@ui.page('/')
async def index():
ui.add_head_html('<style>.big-toggle .q-toggle__label { font-size: 1.2em; }</style>')
with ui.column().classes("w-full max-w-2xl mx-auto gap-6 p-6 shadow-lg rounded-lg bg-gray-50"):
ui.label("Mr.Tang进制转换器").classes("text-4xl font-bold text-center text-gray-800")
with ui.row().classes("w-full items-center gap-6"):
# 使用toggle替代下拉选择框,并调整字体大小和样式
bases = [2, 8, 10, 16]
select_base = ui.toggle(
bases,
value=10
).props('size=lg')
input_number = ui.input(label="输入对应进制数值,支持小数", placeholder="").classes("text-2xl")
def convert_base():
try:
input_value = input_number.value.strip()
from_base = select_base.value
if not input_value:
ui.notify("请输入要转换的数值", type='warning')
return
allowed_chars = {
2: {'0', '1', '.'},
8: set('01234567.'),
10: set('0123456789.'),
16: set('0123456789abcdefABCDEF.')
}
if not all(c in allowed_chars[from_base] for c in input_value):
ui.notify(f"{from_base}进制包含非法字符", type='negative')
return
if input_value.count('.') > 1:
ui.notify("数值包含多个小数点", type='negative')
return
if '.' in input_value:
integer_part, fractional_part = input_value.split('.')
dec = int(integer_part, from_base)
frac = sum(int(d, from_base) * (from_base ** -(i+1))
for i, d in enumerate(fractional_part))
dec += frac
else:
dec = int(input_value, from_base)
for base in [2, 8, 10, 16]:
integer = []
int_part = int(abs(dec))
while int_part > 0:
integer.append(f"{int_part % base:X}")
int_part = int_part // base
fractional = []
frac_part = abs(dec - int(dec))
for _ in range(6):
if frac_part < 1e-9:
break
frac_part *= base
digit = int(frac_part)
fractional.append(f"{digit:X}")
frac_part -= digit
sign = '-' if dec < 0 else ''
int_str = ''.join(reversed(integer)) or '0'
frac_str = ''.join(fractional)
if frac_part > 1e-7:
frac_str = (frac_str + '..')[:8]
result = f"{sign}{int_str}{'.'+frac_str if frac_str else ''}"
results[base].set_text(f" {base}进制: {result}")
except ValueError as e:
ui.notify(f"转换错误: {str(e)}", type='negative')
except Exception as e:
ui.notify(f"系统错误: {str(e)}", type='negative')
ui.button("转换", on_click=convert_base).classes("h-full bg-blue-500 text-white hover:bg-blue-600 text-lg")
with ui.column().classes("w-full gap-4 p-4 bg-white rounded-md"):
results = {
base: ui.label().classes(f"{color} font-mono text-2xl")
for base, color in base_colors.items()
}
@ui.page('/about')
async def about():
ui.label('本项目作者:四川科技职业学院 Mr.Tang').classes("text-lg font-bold text-center")
ui.run(port=8000, title="Mr.Tang进制转换器")
版权属于:
tang01
作品采用:
《
署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
》许可协议授权
评论 (0)