简体   繁体   中英

Counting upper and lower case characters in a string

First off, I know this is far from professional. I'm trying to learn how to work with strings. What this app is supposed to do is take a simple text input and do a few things with it:

count letters, count upper and lower case letters, count words and count spaces. Here is what I've done:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Case Check</title>
    <script type="text/javascript">
        function checkCase(text)
        {   

            var counter = 0;
            var letters = 0;
            var lowercase = 0;
            var uppercase = 0;
            var spaces = 0;
            var words = 0;


            for(; counter < text.length; counter++)
            {
                if(isUpperCase(text.charAt(counter))) {uppercase ++; letters++;}
                if(isLowerCase(text.charAt(counter))) {lowercase ++; letters++;} 
                if((text.charAt(counter) == " ") && (counter < text.length))
                {
                    spaces += 1;
                    words += 1;
                }
                if((text.charAt(counter) == ".") || (text.charAt(text(counter)) == ",")) continue;
            }
            return  [letters, lowercase, uppercase, spaces, words];
        }

        function isUpperCase(character)
        {
            if(character == character.toUpperCase) return true;
            else return false;
        }

        function isLowerCase(character)
        {
            if(character == character.toLowerCase) return true;
            else return false;
        }
    </script>
</head>
<body>
    <script type="text/javascript">
        var typed = prompt("Enter some words.");
        var result = checkCase(typed);
        document.write("Number of letters: " + result[0] + "br /");
        document.write("Number of lowercase letters: " + result[1] + "br /");
        document.write("Number of uppercase letters: " + result[2] + "br /");
        document.write("Number of spaces: " + result[3] + "br /");
        document.write("Number of words: " + result[4] + "br /");
    </script>
</body>

Made several changes due to users' suggestions. The problem now is that it won't let me treat 'text' like a string object.

Use regular expressions.

Example

var s = "thisIsAstring";
var numUpper = s.length - s.replace(/[A-Z]/g, '').length;  

// numUpper = 2

Se more at JavaScript replace/regex

You can use match() and regular expressions.

var str = "aBcD"; 
var numUpper = (str.match(/[A-Z]/g) || []).length;    // 2

Not sure if whole problem, but bad paren on this one

if(text.charAt(letters)) == " " && text(letters) < text.length)
                       ^

Should be

if(text.charAt(letters) == " ") && text(letters) < text.length)
                              ^

And actually I'd make it

if((text.charAt(letters) == " ") && (text(letters) < text.length))

isUpperCase and isLowerCase are not JavaScript functions.

You can replace them with something like

var isUpperCase = function(letter) {
    return letter === letter.toUpperCase();
};

var isLowerCase = function(letter) {
    return letter === letter.toLowerCase();
};

There were a lot of syntax errors in your code which you need to check.

I was also getting confused with all your brackets so instead of using the charAt I just referenced the string like an array. So instead of text.charAt(letters) I used text[letters] which I found easier to read.

See the full jsFiddle here . I modified your code slightly because jsFiddle doesn't allow document.write

Another solution using CharCodeAt() method.

const bigLettersCount = (str) => {
  let result = 0;
  for (let i = 0; i < str.length; i += 1) {
    if (str.charCodeAt(i) > 64 && str.charCodeAt(i) <91 ) {
      result += 1;
    }
   }
   return result
  }

console.log(bigLettersCount('Enter some words.'))

Another solution is using Array.from() make an array which includes each character of str and then using reduce() to count the number of the uppercase letters.

 const str = 'HeLlO'; const res = Array.from(str).reduce((acc, char) => { return acc += char.toUpperCase() === char; }, 0); console.log(res);

Most of the solutions here will fail when string contains UTF8 or diacritic characters. An improved version that works with all strings can be found at the turbocommons library, here:

https://github.com/edertone/TurboCommons/blob/1e230446593b13a272b1d6a2903741598bb11bf2/TurboCommons-Php/src/main/php/utils/StringUtils.php#L391

Example:

// Returns 2
StringUtils.countByCase('1声A字43B45-_*[]', StringUtils.FORMAT_ALL_UPPER_CASE);

// Returns 1
StringUtils.countByCase('1声A字43B45a-_*[]', StringUtils.FORMAT_ALL_LOWER_CASE);

More info here:

https://turbocommons.org/en/blog/2019-10-15/count-capital-letters-in-string-javascript-typescript-php

Play with it online here:

https://turbocommons.org/en/app/stringutils/count-capital-letters

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM