【问题标题】:Currency textbox react-native货币文本框反应原生
【发布时间】:2017-11-08 16:41:24
【问题描述】:

我正在尝试创建一个货币输入,开始类似于

" $00.00"

然后当您开始输入时,它会先输入美分,然后再输入美元(即首先更新右侧的数字),例如

" $00.50"

一位 reddit 用户发布了这段 JS 代码来帮助我:https://codepen.io/benjaminreid/pen/gRbgxK?editors=0010

const FormattedInput = class extends React.Component {
  constructor(props) {
    super(props);

    this.amountChanged = this.amountChanged.bind(this);

    this.state = {
      value: 0,
    };
  }

  amountChanged(e) {
    this.setState({
      value: e.target.value,
    });
  }

  formatValue(value) {
    return accounting.formatMoney(parseFloat(value) / 100);
  }

  render() {
    return (
      <div>
        <label for="formatted">Formatted input</label>
        <input
          id="formatted"
          type="text"
          value={this.formatValue(this.state.value)}  
        />
        <label for="amount">Actual user input (type in here)</label>
        <input
          id="amount"
          type="text"
          onChange={this.amountChanged}
          value={this.state.value}
        />
      </div>
    );
  }
}

const App = () =>
  <div>
    <FormattedInput/>
  </div>
;

ReactDOM.render(
  <App/>,
  document.querySelector('#app')
);

效果很好,但是您输入的输入和显示的输入位于两个不同的框中。我想知道是否有办法直接在格式化的货币框中输入?

也许有人有更好的解决方案吗?非常感谢您的帮助。

【问题讨论】:

  • 困难,您需要应用格式并将光标移动到更改时的正确位置。此外,保存时,您需要删除格式!您能否设置它的样式,使字段看起来像一个,但实际上是两个?例如。没有边框,视图包含带有背景颜色和边框的边框。
  • 这不会导致显示两行文本(您键入的文本和格式化的文本)吗?我觉得很奇怪 react-native 没有简单的方法来处理货币输入。
  • 遇到了同样的问题并使用了类似@G0dsquad 建议的黑客攻击。我将 放在 之上,并将 textinput 颜色设置为透明。所以它看起来像单个组件。有一些库可以处理这个问题,但是输入时文本会一直闪烁,所以我最终得到了这个解决方法。

标签: javascript mobile react-native


【解决方案1】:

我尝试编写一些代码来解决您的问题。从头开始构建并不难。

const FormattedInput = class extends React.Component {
  constructor(props) {
    super(props);

    this.amountChanged = this.amountChanged.bind(this);

    this.state = {
      value: '',
      rawValue: '',
    };
  }

  amountChanged(e) {
    let tmpAmount = '';
    let tmpValue = e.target.value.slice(-1);
    let newRawValue = this.state.rawValue + tmpValue;

    if ( this.state.value.length > e.target.value.length) {
      this.setState({
        value: '',
        rawValue: '',
      })
    }
    else {
      if (newRawValue.length === 1) {
        tmpAmount = '0.0' + newRawValue;
      }
      else if (newRawValue.length === 2) {
        tmpAmount = '0.' + newRawValue;
      }
      else {
        let intAmount = newRawValue.slice(0, newRawValue.length - 2);
        let centAmount = newRawValue.slice(-2);

        tmpAmount = intAmount.replace(/\B(?=(\d{3})+(?!\d))/g, ",") + '.' + centAmount;

      }

      this.setState({
        value: tmpAmount,
        rawValue: newRawValue,
      });

    }
  }

  formatValue(value) {
    return accounting.formatMoney(parseFloat(value) / 100);
  }

  render() {
    return (
      <div>
        <label for="amount">Mix</label>
        <input
          id="amount"
          type="text"
          placeholder="$0.00"
          onChange={this.amountChanged}
          value={this.state.value}
          />
      </div>
    );
  }
}

const App = () =>
<div>
  <FormattedInput/>
</div>
;

ReactDOM.render(
  <App/>,
  document.querySelector('#app')
);

【讨论】:

  • 我正在测试你的解决方案,它从右到左输入数字,但是,它总是输入相同的所有数字,取决于第一个数字,例如,如果我输入 4,它将显示 0.04 ,然后我输入 5,它显示 0.44,然后我输入 6,它显示为 4.44
  • @Lucky_girl 我无法重现您的问题。你可以试试那个pen的解决方案。
猜你喜欢
  • 2017-01-03
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多