Re: lower case only first letter of word

2017-12-06 Thread codephantom via Digitalmars-d-learn

On Tuesday, 5 December 2017 at 13:31:17 UTC, Marc wrote:
Does D have a native function to capitalize only the first 
letter of the word? (I'm asking that so I might avoid reinvent 
the wheel, which I did sometimes in D)


// 
module test;

import std.stdio;

void main()
{
string myString = "heLlo WoRlD!";
writeln( HereItIs(myString) );
}


string HereItIs(string someString)
{
import std.uni : toLower;
import std.ascii : toUpper;

return (someString.ptr[0].toUpper ~  
someString[1..$].toLower);

}
// --



Re: lower case only first letter of word

2017-12-05 Thread Steven Schveighoffer via Digitalmars-d-learn

On 12/5/17 2:41 PM, kdevel wrote:

On Tuesday, 5 December 2017 at 17:25:57 UTC, Steven Schveighoffer wrote:
[...]

struct LowerCaseFirst(R) // if(isSomeString!R)
{
   R src;
   bool notFirst; // terrible name, but I want default false
   dchar front() {
  import std.uni: toLower;
  return notFirst ? src.front : src.front.toLower;
   }
   void popFront() { notFirst = true; src.popFront; }
   bool empty() { return src.empty; }
}

auto lowerCaseFirst(R)(R r)
{
   return LowerCaseFirst!R(r);
}

Warning: it ain't going to be fast. Auto-decoding everywhere.


But one cannot use the return value of lowerCaseFirst as argument for 
foo(string).


Define foo as:

foo(R)(R r) if (isInputRange!R && isSomeChar!(ElementType!R))

Then it can take any range of char types.

Only the use as argument to writeln seems to work. Also I 
had to put


     import std.range.primitives : front, popFront, empty;

outside the struct otherwise the compiler complains about missing front, 
popFront and empty for type string.


Yeah, it wasn't a complete example. These are the extensions to arrays 
that allow them to work as ranges.


-Steve


Re: lower case only first letter of word

2017-12-05 Thread Ali Çehreli via Digitalmars-d-learn

On 12/05/2017 11:41 AM, kdevel wrote:

On Tuesday, 5 December 2017 at 17:25:57 UTC, Steven Schveighoffer wrote:


But one cannot use the return value of lowerCaseFirst as argument for 
foo(string). Only the use as argument to writeln seems to work.


That's how ranges work. LowerCaseFirst produces dchar elements one at a 
time. An easy way of getting a string out of it is calling 
std.conv.text, which converts all those dchars to a series of UTF-8 chars.


Note, .text below is an expensive call because it allocates a new 
string. You may want to cache its result first if you need the result 
more than once:


auto lowered = lowerCaseFirst("HELLO").text;
foo(lowered);

This works:

import std.range;

struct LowerCaseFirst(R) // if(isSomeString!R)
{
   R src;
   bool notFirst; // terrible name, but I want default false
   dchar front() {
  import std.uni: toLower;
  return notFirst ? src.front : src.front.toLower;
   }
   void popFront() { notFirst = true; src.popFront; }
   bool empty() { return src.empty; }
}

auto lowerCaseFirst(R)(R r)
{
   return LowerCaseFirst!R(r);
}

void foo(string s) {
import std.stdio;
writefln("good old string: %s", s);
}

void main() {
import std.conv;
foo(lowerCaseFirst("HELLO").text);
}

Ali


Re: lower case only first letter of word

2017-12-05 Thread kdevel via Digitalmars-d-learn
On Tuesday, 5 December 2017 at 17:25:57 UTC, Steven Schveighoffer 
wrote:

[...]

struct LowerCaseFirst(R) // if(isSomeString!R)
{
   R src;
   bool notFirst; // terrible name, but I want default false
   dchar front() {
  import std.uni: toLower;
  return notFirst ? src.front : src.front.toLower;
   }
   void popFront() { notFirst = true; src.popFront; }
   bool empty() { return src.empty; }
}

auto lowerCaseFirst(R)(R r)
{
   return LowerCaseFirst!R(r);
}

Warning: it ain't going to be fast. Auto-decoding everywhere.


But one cannot use the return value of lowerCaseFirst as argument 
for foo(string). Only the use as argument to writeln seems to 
work. Also I had to put


import std.range.primitives : front, popFront, empty;

outside the struct otherwise the compiler complains about missing 
front, popFront and empty for type string.


Re: lower case only first letter of word

2017-12-05 Thread Ali Çehreli via Digitalmars-d-learn

On 12/05/2017 09:25 AM, Steven Schveighoffer wrote:


Non-allocating version:

struct LowerCaseFirst(R) // if(isSomeString!R)
{
    R src;
    bool notFirst; // terrible name, but I want default false
    dchar front() {
   import std.uni: toLower;
   return notFirst ? src.front : src.front.toLower;
    }
    void popFront() { notFirst = true; src.popFront; }
    bool empty() { return src.empty; }
}

auto lowerCaseFirst(R)(R r)
{
    return LowerCaseFirst!R(r);
}

Warning: it ain't going to be fast. Auto-decoding everywhere.

-Steve


One using existing facilities:

import std.range;
import std.uni;
import std.algorithm;

auto lowerCaseFirst(R)(R r) {
R rest = r.save;
rest.popFront();
return chain(r.front.toLower.only, rest);
}

unittest {
assert(lowerCaseFirst("SchveiGoffer").equal("schveiGoffer"));
assert(lowerCaseFirst("ŞchveıĞöffer").equal("şchveıĞöffer"));
}

void main() {
}

Ali


Re: lower case only first letter of word

2017-12-05 Thread Steven Schveighoffer via Digitalmars-d-learn

On 12/5/17 10:00 AM, Mengu wrote:

On Tuesday, 5 December 2017 at 14:34:57 UTC, Mengu wrote:

On Tuesday, 5 December 2017 at 14:01:35 UTC, Marc wrote:

On Tuesday, 5 December 2017 at 13:40:08 UTC, Daniel Kozak wrote:

[...]


Yes, this is not what I want. I want to convert only the first letter 
of the word to lower case and left all the others immutable. similar 
to PHP's lcfirst():


http://php.net/manual/en/function.lcfirst.php


this is how i'd do it:

string upcaseFirst(string wut) {
  import std.ascii : toUpper;
  import std.array : appender;

  auto s = appender!string;
  s ~= wut[0].toUpper;
  s ~= wut[1..$];
  return s.data;
}


however a solution that does not allocate any memory would be a lot better.


Non-allocating version:

struct LowerCaseFirst(R) // if(isSomeString!R)
{
   R src;
   bool notFirst; // terrible name, but I want default false
   dchar front() {
  import std.uni: toLower;
  return notFirst ? src.front : src.front.toLower;
   }
   void popFront() { notFirst = true; src.popFront; }
   bool empty() { return src.empty; }
}

auto lowerCaseFirst(R)(R r)
{
   return LowerCaseFirst!R(r);
}

Warning: it ain't going to be fast. Auto-decoding everywhere.

-Steve


Re: lower case only first letter of word

2017-12-05 Thread Jacob Carlborg via Digitalmars-d-learn

On 2017-12-05 15:34, Mengu wrote:


this is how i'd do it:

string upcaseFirst(string wut) {
   import std.ascii : toUpper;
   import std.array : appender;

   auto s = appender!string;
   s ~= wut[0].toUpper;
   s ~= wut[1..$];
   return s.data;
}


That's not Unicode aware and is only safe to do with single byte characters.

--
/Jacob Carlborg


Re: lower case only first letter of word

2017-12-05 Thread Mengu via Digitalmars-d-learn

On Tuesday, 5 December 2017 at 14:34:57 UTC, Mengu wrote:

On Tuesday, 5 December 2017 at 14:01:35 UTC, Marc wrote:
On Tuesday, 5 December 2017 at 13:40:08 UTC, Daniel Kozak 
wrote:

[...]


Yes, this is not what I want. I want to convert only the first 
letter of the word to lower case and left all the others 
immutable. similar to PHP's lcfirst():


http://php.net/manual/en/function.lcfirst.php


this is how i'd do it:

string upcaseFirst(string wut) {
  import std.ascii : toUpper;
  import std.array : appender;

  auto s = appender!string;
  s ~= wut[0].toUpper;
  s ~= wut[1..$];
  return s.data;
}


however a solution that does not allocate any memory would be a 
lot better.


Re: lower case only first letter of word

2017-12-05 Thread Mengu via Digitalmars-d-learn

On Tuesday, 5 December 2017 at 14:01:35 UTC, Marc wrote:

On Tuesday, 5 December 2017 at 13:40:08 UTC, Daniel Kozak wrote:
but this will change all other uppercase to lowercase, so 
maybe it is not what you want. If you really want just change 
first char to upper, then there is nothing wrong to do it 
yourself


On Tue, Dec 5, 2017 at 2:37 PM, Daniel Kozak 
 wrote:


Something like this: 
https://dlang.org/phobos/std_uni.html#asCapitalized


On Tue, Dec 5, 2017 at 2:31 PM, Marc via Digitalmars-d-learn 
< digitalmars-d-learn@puremagic.com> wrote:


Does D have a native function to capitalize only the first 
letter of the word? (I'm asking that so I might avoid 
reinvent the wheel, which I did sometimes in D)


Yes, this is not what I want. I want to convert only the first 
letter of the word to lower case and left all the others 
immutable. similar to PHP's lcfirst():


http://php.net/manual/en/function.lcfirst.php


this is how i'd do it:

string upcaseFirst(string wut) {
  import std.ascii : toUpper;
  import std.array : appender;

  auto s = appender!string;
  s ~= wut[0].toUpper;
  s ~= wut[1..$];
  return s.data;
}


Re: lower case only first letter of word

2017-12-05 Thread Marc via Digitalmars-d-learn

On Tuesday, 5 December 2017 at 13:40:08 UTC, Daniel Kozak wrote:
but this will change all other uppercase to lowercase, so maybe 
it is not what you want. If you really want just change first 
char to upper, then there is nothing wrong to do it yourself


On Tue, Dec 5, 2017 at 2:37 PM, Daniel Kozak 
 wrote:


Something like this: 
https://dlang.org/phobos/std_uni.html#asCapitalized


On Tue, Dec 5, 2017 at 2:31 PM, Marc via Digitalmars-d-learn < 
digitalmars-d-learn@puremagic.com> wrote:


Does D have a native function to capitalize only the first 
letter of the word? (I'm asking that so I might avoid 
reinvent the wheel, which I did sometimes in D)


Yes, this is not what I want. I want to convert only the first 
letter of the word to lower case and left all the others 
immutable. similar to PHP's lcfirst():


http://php.net/manual/en/function.lcfirst.php


Re: lower case only first letter of word

2017-12-05 Thread Daniel Kozak via Digitalmars-d-learn
but this will change all other uppercase to lowercase, so maybe it is not
what you want. If you really want just change first char to upper, then
there is nothing wrong to do it yourself

On Tue, Dec 5, 2017 at 2:37 PM, Daniel Kozak  wrote:

> Something like this: https://dlang.org/phobos/std_uni.html#asCapitalized
>
> On Tue, Dec 5, 2017 at 2:31 PM, Marc via Digitalmars-d-learn <
> digitalmars-d-learn@puremagic.com> wrote:
>
>> Does D have a native function to capitalize only the first letter of the
>> word? (I'm asking that so I might avoid reinvent the wheel, which I did
>> sometimes in D)
>>
>
>


Re: lower case only first letter of word

2017-12-05 Thread ketmar via Digitalmars-d-learn

Marc wrote:

Does D have a native function to capitalize only the first letter of the 
word? (I'm asking that so I might avoid reinvent the wheel, which I did 
sometimes in D)


http://dpldocs.info/experimental-docs/std.string.capitalize.html
http://dpldocs.info/experimental-docs/std.uni.asCapitalized.html

searching rox!

p.s.: but beware, it will lowercase all the letters except the first one, 
so it may not be exactly the thing you aksed for.


Re: lower case only first letter of word

2017-12-05 Thread Daniel Kozak via Digitalmars-d-learn
Something like this: https://dlang.org/phobos/std_uni.html#asCapitalized

On Tue, Dec 5, 2017 at 2:31 PM, Marc via Digitalmars-d-learn <
digitalmars-d-learn@puremagic.com> wrote:

> Does D have a native function to capitalize only the first letter of the
> word? (I'm asking that so I might avoid reinvent the wheel, which I did
> sometimes in D)
>