How to remove all characters from a string, except the integers?

ag0aep6g anonymous at example.com
Fri Mar 4 20:38:11 UTC 2022


On Friday, 4 March 2022 at 19:51:44 UTC, matheus wrote:
> import std.datetime.stopwatch;
> import std.stdio: write, writeln, writef, writefln;
> import std;
>
> void printStrTim(string s,StopWatch sw){
>     writeln("\nstr: ", s
>             ,"\nTim(ms): ", sw.peek.total!"msecs"
>             ,"\nTim(us): ", sw.peek.total!"usecs"
>            );
> }
>
> void main(){
>     auto sw = StopWatch(AutoStart.no);
>     string s, str = "4A0B1de!2C9~6";
>     int j;
>
>     sw.start();
>     for(j=0;j<1_000_000;++j){
>         s="";
>         foreach(i;str){
>             (i >= '0' && i <= '9') ? s~=i : null;
>         }
>     }
>     sw.stop();
>     printStrTim(s,sw);
>
>     s = "";
>     sw.reset();
>     sw.start();
>     for(j=0;j<1_000_000;++j){
>         s="";
>     	s = str.filter!(ch => ch.isDigit).to!string;
>     }
>     sw.stop();
>     printStrTim(s,sw);
> }
>
> Prints:
>
> str: 401296
> Tim(ms): 306
> Tim(us): 306653
>
> str: 401296
> Tim(ms): 1112
> Tim(us): 1112648
>
> -------------------------------
>
> Unless I did something wrong (If anything please tell).

The second version involves auto-decoding, which isn't actually 
needed. You can work around it with `str.byCodeUnit.filter!...`. 
On my machine, times become the same then.

Typical output:

str: 401296
Tim(ms): 138
Tim(us): 138505

str: 401296
Tim(ms): 137
Tim(us): 137376



More information about the Digitalmars-d-learn mailing list