Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 24x 24x 24x 24x 24x 24x 24x 24x 31x 11x 11x 1x 10x 10x 10x 10x 20x 12x 11x 10x 10x 1x 9x 1x 1x 8x 20x | const _b = 1 const _kb = _b * 1024 const _mb = _kb * 1024 const _gb = _mb * 1024 const _tb = _gb * 1024 const _pb = _tb * 1024 export type BytesUnit = 'PB' | 'TB' | 'GB' | 'MB' | 'KB' | 'B' export type BytesNumberValue = number export type BytesStringValue = `${number}${BytesUnit}` export type BytesValue = BytesNumberValue | BytesStringValue const unitToBytes: Record<BytesUnit, number> = Object.create({ PB: _pb, TB: _tb, GB: _gb, MB: _mb, KB: _kb, B: _b, }) const re = /^(\d+(?:\.\d+)?)(PB|TB|GB|MB|KB|B)$/ /** * 获取字节值。 * * @param value 值 * @param unit 单位 */ export function bytes(value: number, unit: BytesUnit): number /** * 获取字节值。 * * @param value 值 */ export function bytes(value: BytesValue): number export function bytes(value: BytesValue, unit?: BytesUnit): number { let bytesValue!: number if (typeof value === 'string' && value.length > 0) { const match = re.exec(value) if (!match) { throw new TypeError(`value 值非法: value=${JSON.stringify(value)}`) } const v = parseFloat(match[1]) const u: BytesUnit = match[2] as any const t = unitToBytes[u] bytesValue = v * t } else if (typeof value === 'number' && isFinite(value)) { if (unit != null) { if (typeof unit === 'string') { const t = unitToBytes[unit] if (!t) { throw new TypeError(`unit 值非法: unit=${JSON.stringify(unit)}`) } bytesValue = value * t } else { throw new TypeError('unit 必须是一个字符串') } } else { bytesValue = value } } else { throw new TypeError('value 必须是字符串或数字') } return bytesValue } |