Node.js中util.format()的补充函数

时间:2017-08-26 19:56:24

标签: javascript node.js

我知道如何使用util.format()使用%f,%d等格式化字符串。有人能告诉我哪个是从字符串(而不是从控制台输入)启用SCANNING的补充功能。

例如:

...运行

const util = require('util');
var weatherStr = util.format(`The temperature at %d o' clock was %f deg. C and the humidity was %f.`, 5, 23.9, 0.5);
console.log(weatherStr);

... ...生成

The temperature at 5 o' clock was 23.9 deg. C and the humidity was 0.5.

我期待一个util函数可以运行以下代码......

const util = require('util');
var weatherStr = 'The temperature at 5 o' clock was 23.9 deg. C and the humidity was 0.5.';
console.log(util.????(tempStr, `humidity was %f.`));

... ...生成

0.5

这是执行此功能的util函数?我不认为“parseFloat”会起作用,因为它会提取23.9。

我是JS和Node的新手,但我期待一个“扫描”功能。我知道有一个scanf npm库,但它似乎与控制台输入而不是现有字符串一起使用。我一直在JS和Node函数中搜索“%f”,令人惊讶的是,util.format似乎是唯一一个提及它的人。

2 个答案:

答案 0 :(得分:1)

我不知道任何类似的扫描库,但您可以使用正则表达式。以下是您可以使用的一些模式:

  • 整数:[+-]?\d+
  • 十进制:[+-]?\d+(?:\.\d+)?

如果将它们放在捕获组中,则可以从String#match返回的数组中访问相应的匹配项:



var weatherStr = "The temperature at 5 o'clock was 23.9 deg. C and the humidity was 0.5.";
console.log(+weatherStr.match(/humidity was ([+-]?\d+(?:\.\d+)?)./)[1]);




您可以创建一个可以处理%d%f的实用程序功能:



function scanf(input, find) {
    var pattern = {
        "d": "(\\d+)",
        "f": "(\\d+(?:\\.\\d+)?)"
    };
    find = find
        // Escape characters for use in RegExp constructor:
        .replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
        // Replace %-patterns
        .replace(/((?:\\)*)%([a-z])/g, function (m, a, b) {
            return a.length % 4 == 0 && b in pattern ? a + pattern[b] : m;
        });
    var match = input.match(new RegExp(find));
    return match && match.slice(1).map(Number);
}

var weatherStr = "The temperature at 5 o'clock was 23.9 deg. C and the humidity was 0.5.";
console.log(scanf(weatherStr, "humidity was %f"));
console.log(scanf(weatherStr, "at %d o'clock was %f"));




答案 1 :(得分:0)

感谢trincot!

实际上,结果是scanf npm库(https://www.npmjs.com/package/scanf)解决了我的问题。我只是没有读完它。我不得不安装“sscanf”(注意双s)。 sscanf方法(在包页面的底部列出)正如我预期的那样工作。

我很惊讶这个包不是更受欢迎,但这正是我需要的。再次感谢!