rivo
Version:
🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.
37 lines (35 loc) • 1.06 kB
TypeScript
import type { _StrToNum } from "./_StrToNum";
import type { Reverse } from "../../Str/Reverse";
/**
* Divide integer `N` by 10^`Length<By>`.
*
* **⚠️ Warning:** length of `By` must be less than or equal to the number of digits in `N`.
* @private
*
* @example
* ```typescript
* type R1 = _Div10<125, "_">;
* // ^?: 12.5
* type R2 = _Div10<-12300, "__">;
* // ^?: -123
* type R3 = _Div10<-12300, "___">;
* // ^?: -12.3
* ```
*/
export type _Div10<N extends number, By extends string> = _StrToNum<
__Div10<Reverse<`${N}`>, By, ""> extends infer R extends string ?
R extends `.${infer R}` ?
`0.${R}`
: R
: never
>;
type __Div10<A extends string, By extends string, B extends string> =
By extends `${string}${infer RestBy}` ?
A extends `${infer F}${infer R}` ?
__Div10<R, RestBy, `${F}${B}`>
: never
: _RemoveTrailingFractional0s<`${Reverse<A>}.${B}`>;
type _RemoveTrailingFractional0s<S extends string> =
S extends `${infer F}0` ? _RemoveTrailingFractional0s<F>
: S extends `${infer F}.` ? F
: S;