基于NiceGUI的进制转换器支持小数

基于NiceGUI的进制转换器支持小数

tang01
2025-04-22 / 0 评论 / 42 阅读 / 正在检测是否收录...

效果展示

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进制转换器")
0

评论 (0)

取消