import { Ionicons } from '@expo/vector-icons'; import React from 'react'; import { Dimensions, StyleSheet, Text, TouchableOpacity, View, } from 'react-native'; interface NumberKeyboardProps { onNumberPress: (number: string) => void; onDeletePress: () => void; onDecimalPress: () => void; hasDecimal?: boolean; maxLength?: number; currentValue?: string; } const { width } = Dimensions.get('window'); const keyWidth = (width - 80) / 3; // 减去左右边距和间隙 export default function NumberKeyboard({ onNumberPress, onDeletePress, onDecimalPress, hasDecimal = false, maxLength = 6, currentValue = '', }: NumberKeyboardProps) { const handleNumberPress = (number: string) => { if (currentValue.length >= maxLength) return; // 防止输入多个0开头 if (currentValue === '0' && number === '0') return; // 如果当前是0,输入非0数字时替换 if (currentValue === '0' && number !== '0') { // 这里不需要replace,直接传递number即可 return; } onNumberPress(number); }; const handleDecimalPress = () => { if (hasDecimal || currentValue.includes('.')) return; onDecimalPress(); }; const renderKey = ( value: string, onPress: () => void, style?: any, textStyle?: any, disabled?: boolean ) => ( {value === 'delete' ? ( ) : ( {value} )} ); return ( {renderKey('1', () => handleNumberPress('1'))} {renderKey('2', () => handleNumberPress('2'))} {renderKey('3', () => handleNumberPress('3'))} {renderKey('4', () => handleNumberPress('4'))} {renderKey('5', () => handleNumberPress('5'))} {renderKey('6', () => handleNumberPress('6'))} {renderKey('7', () => handleNumberPress('7'))} {renderKey('8', () => handleNumberPress('8'))} {renderKey('9', () => handleNumberPress('9'))} {renderKey( '.', handleDecimalPress, undefined, undefined, hasDecimal || currentValue.includes('.') )} {renderKey('0', () => handleNumberPress('0'))} {renderKey('delete', onDeletePress)} ); } const styles = StyleSheet.create({ container: { backgroundColor: '#F9FAFB', paddingVertical: 20, paddingHorizontal: 20, borderTopWidth: 1, borderTopColor: '#E5E7EB', }, row: { flexDirection: 'row', justifyContent: 'space-between', marginBottom: 12, }, key: { height: 50, backgroundColor: '#FFFFFF', borderRadius: 12, alignItems: 'center', justifyContent: 'center', shadowColor: '#000', shadowOffset: { width: 0, height: 1 }, shadowOpacity: 0.05, shadowRadius: 2, elevation: 1, borderWidth: 1, borderColor: '#E5E7EB', }, keyDisabled: { backgroundColor: '#F3F4F6', opacity: 0.5, }, keyText: { fontSize: 20, fontWeight: '600', color: '#374151', }, keyTextDisabled: { color: '#9CA3AF', }, });