type-challenges icon indicating copy to clipboard operation
type-challenges copied to clipboard

1978 - Percentage Parser

Open Xieyongshen opened this issue 4 years ago • 6 comments

type CheckPrefix<T> = T extends '+' | '-' ? T : never;
type CheckSuffix<T> =  T extends `${infer P}%` ? [P, '%'] : [T, ''];
type PercentageParser<A extends string> = A extends `${CheckPrefix<infer L>}${infer R}` ? [L, ...CheckSuffix<R>] : ['', ...CheckSuffix<A>];

Xieyongshen avatar Oct 09 '21 07:10 Xieyongshen

nice job

naecoo avatar Dec 11 '21 08:12 naecoo

Thanks for the nice code

wangtunan avatar Feb 12 '22 13:02 wangtunan

You are incredibly smart! Fantastic.

Kakeru-Miyazaki avatar Nov 25 '23 02:11 Kakeru-Miyazaki

Little more readable

type PercentageParser<A extends string> = A extends `${infer Num}%`
  ? [...NumberParser<Num>, '%']
  : [...NumberParser<A>, ''];

type NumberParser<A extends string> = A extends `${infer Sign extends '+' | '-'}${infer Num}`
  ? [Sign, Num]
  : ['', A];

mrThomasTeller avatar May 16 '24 21:05 mrThomasTeller

type PercentageParser<A extends string,F1 extends string='',F2 extends string='',F3 extends string=''> = A extends `${infer A1}${infer R}`?A1 extends "-"|"+"?PercentageParser<R,A1>:A1 extends `${infer BBB extends number}`?PercentageParser<R,F1,`${F2}${A1}`>:PercentageParser<R,F1,F2,"%">:[F1,F2,F3]

soeasyjx avatar Jun 22 '24 05:06 soeasyjx

image

qingzhoufeihu avatar Aug 20 '24 07:08 qingzhoufeihu

type PercentageParser<
  T extends string,
  R extends string[] = []
> = R["length"] extends 0
// check operator
  ? T extends `${infer O extends "+" | "-"}${infer Rest extends string}`
    ? PercentageParser<Rest, [...R, O]>
    : PercentageParser<T, [...R, ""]>
// check empty
  : T extends "" ? [...R, "", ""]
// check number and %
     : T extends `${infer N extends string}%${string}`
     ? [...R, N, "%"]
     : [...R, T, ""];

cin12211 avatar Sep 10 '24 01:09 cin12211

type PercentageParser<A extends string> =
	(A extends `${infer S extends '+' | '-'}${string}` ? S : '') extends infer S extends string ?
	(A extends `${string}${infer P extends '%'}` ? P : '') extends infer P extends string ?
	A extends `${S}${infer N}${P}` ?
	[S, N, P] : never : never : never;

zeorin avatar Sep 15 '24 15:09 zeorin

How about that?

type PercentageParser<T extends string, A extends any[] = ['', '', '']> = 
  T extends `${infer First}${infer Tail}` 
    ? PercentageParser<
      Tail, 
      First extends '+' | '-' ? [First, A[1], A[2]] : First extends '%' 
        ? [A[0], A[1], First] 
        : [A[0], `${A[1]}${First}`, A[2]]>
    : A;

AJSN1988 avatar Dec 20 '24 14:12 AJSN1988